赞
踩
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。
急于现在、立刻、马上解决问题的同学,请直接拉到最下面的【五、总结】!!!
通过本篇的学习,你将学会Base64的基本概念,优缺点,常用的编码、解码方法,以及项目中的实战使用。
更多使用Base64编码的原因,以及实际使用Demo,请看我另一篇博文:详解AES、MD5加密算法的区别和实现,包含Utils类
更多使用Base64的方法,以及实战用法,请看我另一篇博文:Java Base64工具类,提供常用(文件、图片、PDF、URL)转换方法(原创博文,欢迎转载)
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
按照出现时间和JAR的不同,目前主流有三种方式,如下(此处借鉴了前辈经验):
用法如下(示例):
- 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();
-
- @Test
- public 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、图片、文件或其他。
优缺点:
所以,我们完全不建议再使用此方法,只作为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();
-
- @Test
- public 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、图片、文件或其他。
优缺点:
这是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();
-
- @Test
- public 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、图片、文件或其他。
优缺点:
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:
我是一名小白程序员,您的点赞、评论和关注,是我不懈创作的动力!!
学无止境,气有浩然,让我们一起加油,乘风破浪,江湖有缘再见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。