- Base64 文档
- Base64 的作用
- binary-to-text encoding
- 二进制转文本的编码方式
- 应用场景
- Base64 encoding schemes are commonly used when there is a need to encode binary data that needs to be stored and transferred over media that are designed to deal with ASCII. This is to ensure that the data remain intact without modification during transport.
- 当二进制数据需要在只支持 ASCII 编码的地方存储和传输的时候,可以考虑将二进制数据通过 Base64 进行编码。
实现方式
- 从待编码的数据中每3个字节一组,一共是
3x8=24bit,划为4组,每组正好6个bit(0-63),然后从ASCII 的 A-Za-z0-9+/一共 64 个字符中根据下标来获取对应的 ASCII 字符,这样就将 3 位二进制数据转换成了 4 位的 ASCII 了。

- Base64 会增大数据大小,至少变为原来的 133%(4/3)。如果,只是一个字符的话,那大小会从 1 -> 4,增加为了原来的 400%。
- 如果代编码数据的大小不是 3 的整数倍,则会通过补足
0x00的方式来填满,并自动在末尾增加对应个数的=来表示补足了几位。
- 因为
+//等符号在 url 中是特殊字符,所以有一种url_safe的编码方式,会将+//转变为-/_。
- 有的编码也会将末尾补足的 = 去掉,这样在解码的时候只要保证待解码的数据的大小是 3 的整数倍即可,不足的自动补齐即可。
代码
- 下面是 Base64 类中的几个常量 Flag
- DEFAULT:默认的编码方式
- NO_PADDING:不需要对齐,即去掉末尾可能存在的
=
- NO_WRAP:去掉换行符,结果是一行
- CRLF:标记换行符的格式是
CRLF而不仅仅是一个LF
- URL_SAFE:对于 url 以及文件名友好的 Base64 输出结果,会用
-/_替代+和/
public static final int DEFAULT = 0;
public static final int NO_PADDING = 1;
public static final int NO_WRAP = 2;
public static final int CRLF = 4;
public static final int URL_SAFE = 8;
public static final int NO_CLOSE = 16;
结论
- 写这篇文章的原因是我在代码中发现有同事将字符串 Base64 编码然后存储起来了,并且用的是
compress压缩作为方法名,我就很疑惑 Base64 只是一种编码方式还能起到压缩字符串大小的作用吗?所以研究了下 Base64,虽然很简单也很常用,但是其实对其并不了解趁机熟悉一下。
- Base64 并不能压缩,反而会增加数据大小。
- Base64 并不能用于加密,只是一种编码方式。
- Base64 中的 64 应该是指其对应编码的 64 个结果,即[A-Za-z0-9+/]这 64 个 ASCII 字符。