关于Base64编码(Encode)与解码(Decode)的几种方式,这里面有道道
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。
前言
急于现在、立刻、马上解决问题的同学,请直接拉到最下面的【五、总结】!!!
通过本篇的学习,你将学会Base64的基本概念,优缺点,常用的编码、解码方法,以及项目中的实战使用。
更多使用Base64编码的原因,以及实际使用Demo,请看我另一篇博文:详解AES、MD5加密算法的区别和实现,包含Utils类
更多使用Base64的方法,以及实战用法,请看我另一篇博文:Java Base64工具类,提供常用(文件、图片、PDF、URL)转换方法(原创博文,欢迎转载)
一、Base64是什么?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是一种用64个字符来表示任意二进制数据的方法;
Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单;
Base64只是一种通过查表的编码算法,不是安全领域下的加解密算法,所以不能单独用于加密,即使使用自定义的编码表也不行;
Base64的编码与解码,只是字符到二进制与二进制到字符的过程,所以特别适用于小段内容的编码,比如http、数字证书签名、Cookie的内容等。
注意,UTF-8和GBK中文格式的Base64编码结果是不同的。
二、原理
Base64的原理很简单,首先,准备一个包含64个字符的数组:['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24
bit,划为4组,每组正好6个bit:
这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00
字节在末尾补足后,再在编码的末尾加上1个或2个=
号,表示补了多少字节,解码的时候,会自动去掉。
此处解释摘自“廖雪峰”老师的官方描述,链接地址:https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184
三、Java下Base64的编码与解码
按照出现时间和JAR的不同,目前主流有三种方式,如下(此处借鉴了前辈经验):
1.sun.misc下的BASE64Encoder和BASE64Decoder
用法如下(示例):
import org.junit.Test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;public class Base64Test {private static final BASE64Encoder ENCODE_64 = new BASE64Encoder();private static final BASE64Decoder DECODE_64 = new BASE64Decoder();@Testpublic void sun_misc_base64_T() {String text = "这是一串需要编码的明文,可以是URL、图片、文件或其他。";try {// 编码String encodedToStr = ENCODE_64.encodeBuffer(text.getBytes("UTF-8"));System.out.println("encodedToStr = " + encodedToStr);// 解码String byteToText = new String(DECODE_64.decodeBuffer(encodedToStr), "UTF-8");System.out.println("byteToText = " + byteToText);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
结果展示:
encodedToStr = 6L+Z5piv5LiA5Liy6ZyA6KaB57yW56CB55qE5piO5paH77yM5Y+v5Lul5pivVVJM44CB5Zu+54mH
44CB5paH5Lu25oiW5YW25LuW44CC
byteToText = 这是一串需要编码的明文,可以是URL、图片、文件或其他。
优缺点:
- 这是JDK中自带的BASE64工具;
- 但是所提供的Base64功能编码和解码的效率并不太高,而且在JDK1.9以后就不被维护了。
所以,我们完全不建议再使用此方法,只作为Base64知识的扩展,重点关注下面两种方法。
2.org.apache.commons.codec.binary下的Base64
用法如下(示例):
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;public class Base64Test {private static final Base64 BASE_64 = new Base64();@Testpublic void sun_misc_base64_T() {String text = "这是一串需要编码的明文,可以是URL、图片、文件或其他。";try {// 编码String encodedToStr = BASE_64.encodeToString(text.getBytes("UTF-8"));System.out.println("encodedToText = " + encodedToStr);// 解码String byteToText = new String(BASE_64.decode(encodedToStr), "UTF-8");System.out.println("byteToText = " + byteToText);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}
}
结果展示:
encodedToText = 6L+Z5piv5LiA5Liy6ZyA6KaB57yW56CB55qE5piO5paH77yM5Y+v5Lul5pivVVJM44CB5Zu+54mH44CB5paH5Lu25oiW5YW25LuW44CC
byteToText = 这是一串需要编码的明文,可以是URL、图片、文件或其他。
优缺点:
- 与sun.misc方式比较,它的效率更高,代码更简洁;
- 与org.apache.commons.codec.binary方式比较,它所有的JDK版本都支持,不只局限于JDK1.8以上。
3.java.util下的Base64
这是JDK1.8的java.util套件中新增的类,目的就是高效的处理Base64的编码与解码,用法如下(示例):
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.util.Base64;public class Base64Test {private static final Base64.Decoder DECODE_64 = Base64.getDecoder();private static final Base64.Encoder ENCODE_64 = Base64.getEncoder();@Testpublic void sun_misc_base64_T() {String text = "这是一串需要编码的明文,可以是URL、图片、文件或其他。";try {// 编码String encodedToStr = ENCODE_64.encodeToString(text.getBytes("UTF-8"));System.out.println("encodedToStr = " + encodedToStr);// 解码String byteToText = new String(DECODE_64.decode(encodedToStr), "UTF-8");System.out.println("byteToText = " + byteToText);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}
}
结果展示:
encodedToStr = 6L+Z5piv5LiA5Liy6ZyA6KaB57yW56CB55qE5piO5paH77yM5Y+v5Lul5pivVVJM44CB5Zu+54mH44CB5paH5Lu25oiW5YW25LuW44CC
byteToText = 这是一串需要编码的明文,可以是URL、图片、文件或其他。
优缺点:
- java.util提供的Base64拥有更好的效能,实际测试编码与解码速度的话,比sun.misc套件提供的还要快至少11倍,比org.apache.commons.codec.binary提供的还要快至少3倍;
- 但是,需要JDK1.8以后的版本才支持。
四、Python下Base64的编码与解码
Python内置的Base64可以直接进行base64的编解码:
>>> import base64
>>> base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'
由于标准的Base64编码后可能出现字符+
和/
,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+
和/
分别变成-
和_
:
>>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd++//'
>>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
b'i\xb7\x1d\xfb\xef\xff'
五、总结
感觉Python里面没太多需要注意的,所以下面的总结只针对Java:
- 如果项目的JDK版本小于1.8,请使用org.apache.commons.codec.binary.Base64;
- 如果项目的JDK版本大于1.8,请使用java.util.Base64;
- 使用org.apache.commons.codec.binary.Base64时,要选择与项目JDK相符的JAR包,否则实现不了效果;
- java.util.Base64与org.apache.commons.codec.binary.Base64包冲突,不能同时存在一个类中;
- 注意,UTF-8和GBK中文格式的Base64编码结果是不同的。
我是一名小白程序员,您的点赞、评论和关注,是我不懈创作的动力!!
学无止境,气有浩然,让我们一起加油,乘风破浪,江湖有缘再见。
关于Base64编码(Encode)与解码(Decode)的几种方式,这里面有道道相关推荐
- Base64的编码(Encode)与解码(Decode)
Base64的编码(Encode)与解码(Decode) 推荐第一种 效率更高. 第一种:java8 新版本 @Testpublic void test1(){//现在Base64编码 import ...
- Java如何进行Base64的编码(Encode)与解码(Decode)?
关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法,而这个Binary资料和字串资料彼此之间是可以互相转换的,十分方便 ...
- Python编码encode()与解码decode()介绍与示例演示
1.编码与解码介绍 位:计算机最小的单位 二进制中的一位 用二进制的 0/1表示. 字节:八位组成一个字节. 字符:我们肉眼可见的文字与符号. 字符集:字符的集合. 编码:将字符转换成计算机可识别的0 ...
- Base64编码和Python解码
base64是网络上最常见的用于传输8Bit字节码的编码方式之一,是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息. 采用Base64编码具有不可读性,需要解码后才能阅读. 本文是关于 ...
- oracle行转列 case,Oracle 行转列总结 Case When,Decode,PIVOT 三种方式
Decode 方式 SELECT a.COUNTRY AS "国家", SUM(DECODE(a.SEX, 1, a.POPULCATION)) AS "男", ...
- js实现base64编码和解码
文章目录 需求 什么是Base64 编码规则 如何解码 js实现基于base64的编码解码 window自带函数进行Base64编码解码 Base64编码的实际运用 图片base64编码 需求 应公司 ...
- Base64编码/解码VB6超精简版(适用于中、英文)
上次因为要编写自动登录邮箱的程序,需要Base64编码,但是我看了几种版本的VB下Base64编码的程序,发现要么就是太冗长,要么就是不支持中文,要么根本不能用,于是我想求人不如求己,便仔细研究了一下 ...
- 一文带你读懂base64编码
hi,大家好,我是开发者FTD.相信很多同学在工作中,经常会用到Base64编码,那大家知道为什么会有Base64编码吗?我们为什么要使用它呢,它又是怎么实现的呢?下面就让我们来一起深入探究一下Bas ...
- 密码学-编码算法:Base64编码原理和使用
1.Base64简介 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,可用于在 ...
- Base64 Encode/Decode Class C++ SourceCode - Base64编码/解码 类 C++ 源码
Base64 Encode/Decode Class C++ SourceCode - Base64编码/解码 类 C++ 源码 1.Base64.h // Base64.h: interface f ...
最新文章
- 入坑推荐系统,拿这个开源项目练手
- 磊哥评测之数据库:腾讯云MongoDB vs自建
- 【转】SOAR平台初探(一)
- 小程序中input标签没有反应_鸢尾花预测:如何创建机器学习Web应用程序?
- java 防止sql xxs注入,Java-JSP网站 防SQL注入,防XSS等攻击有什么好的处理办法?...
- __call__方法解析
- android 启动多个进程,Android开启多进程
- Scientific Linux 6.4安装详程
- Struts2学习笔记 - Action篇定义逻辑Action
- 统信UOS升级Python3及安装spyder5
- 基于PaddleX的化妆品识别
- Python办公自动化Excel
- 蓝牙模块惨痛教训——模块与单片机串口的隔离(更新)
- protobuffer简介
- PageHelper这种情况下有坑,注意别吃亏
- dz diy html用户信息,Discuz教程:个人资料设置只显示用户名的解决方法
- C语言结构标记的作用,C语言基础知识之词法符号
- [洛谷P1856] [USACO5.5]矩形周长Picture
- GIS大讨论(十一):当前地理信息产业发展动向与趋势
- list与tuple
热门文章
- 拼多多推广位备案方法(2021.5.5)
- Centos6.X升级至Centos7.2升至Centos7.9详细步骤和踩过的坑(升级者必看~)
- 基于切比雪夫空间距离的空间跳跃体绘制加速方法(Empty Space Skipping-ESS)
- 鸡呼吸疾病常见的症状 防治鸡打喷嚏的特效药
- 竟然可以用python炒股?
- 调用自定义模块出现ModuleNotFoundError: No module named ‘XXX‘的解决方案
- 洛谷刷题——P1192 台阶问题
- 一个关于微信微信免费自动投票软件与专门投票的微信群的教程介绍
- virt-install命令参数
- Cascading介绍