BASE64编码
概要
接上篇【BASE64编码初识——符合BASE64编码规则的字符串但解不出来属于BASE64编码吗?】我们先介绍一下BASE64编码的编码规则。
基本概念
- BASE64和上次介绍的ASCII编码和UTF-8编码一样都仅仅是一种编码方式。它既不是压缩,也不是加密。既然是编码可能会增加数据的长度
(使用 Base64 编码时需要注意数据长度的增加,因为 Base64 编码会将原始数据扩展为约 4/3 倍)
字符集
:使用 64 个不同的 ASCII 字符来表示二进制数据,包括大小写字母 A-Z、a-z、数字 0-9,以及两个特殊字符 ‘+’ 和 ‘/’。通常还会使用 ‘=’ 作为填充字符。填充字符
: ‘=’ 作为填充字符,最后一组数据不足 3 个字节,会使用一个或两个 ‘=’ 字符进行填充,以确保最终的 Base64 编码长度为4 的整数倍
。编码原理
:一个BASE64编码中的字符对应6 bits二进制数据。编码对应表
:
编解码实例
由于编码不好理解,我们先从解码来说。示例:"SSBsb3ZlIHlvdSE="这是一个BASE64编码后的字符串。(怎么判断?首先字符集符合BASE64的字符集,长度是4的倍数。)
解码
根据上图的编码对应表,找到每个字符对应的二进制数据:
S
——010010
S
——010010
B
——000001
s
——101100
…E
——000100
除了最后一个字符=
,前面的SSBsb3ZlIHlvdSE
对应的二进制数据是:010010010010000001101100....000100
- 最后一个
=
怎么处理呢?一个=
代表最后要去掉两个0
,如果是两个=
就代表要去掉四个0
。最后对应二进制数据就是SSBsb3ZlIHlvdSE=
等价于010010010010000001101100....0001
得到了010010010010000001101100....0001
这个二进制的数据,再根据ASCII编码或UTF-8编码(8bits对应一个字符)对应表得到:
01001001
——I
(大写的I)00100000
——空格
01101100
——l
(小写的L)
…- 对应过来就是
SSBsb3ZlIHlvdSE=
就是I love you!
编码
接下来我们对I love you!
进行BASE64编码。
- 第一步:先根据ASCII编码将
I love you!
转成二进制编码。
I
——01001001
空格
——00100000
l
——01101100
…- 那么对应的二进制数据就是:
010010010010000001101100....0001
- 第二步:将得到的二进制数据,从左到右开始对照BASE64编码表,找到对应的字符。
切记:6 bits二进制数据对应一个字符哦
010010
——S
010010
——S
000001
——B
101100
——s
…- 到最后只剩下了四个二进制数据
0001
怎么办凑不够,那就补两个00
,就变成了000100
对应的就是000100
——E
。- 这里我们填了两个
0
,所以就在最后加个=
代表你转换的时候多加了两个0
。告诉对方解码的时候,记得最后加了两个0
。那么如果加了四个0
,你就要加两个=
,告诉对方解码的时候,要记得最后四个0
是加的。
- 第三步:得到最后的编码:
010010010010000001101100....0001
按照BASE64编码后就变成了SSBsb3ZlIHlvdSE=
- 所以最后的
=
只是为了告诉解码的时候,如果一个=
就减掉两个多余的0
,如果两个=
就减掉四个多余的0
。
问题答案
现在我们来解密【BASE64编码初识——符合BASE64编码规则的字符串但解不出来属于BASE64编码吗?】这篇文章中的问题:
- 符合BASE64编码规则的字符串但解不出来属于BASE64编码吗?
- 符合BASE64编码规则的字符串,所谓的解不出来是无法转换成我们能看懂的字符串而已,但是对应的都有各自的字符串。所以符合BASE64编码规则的字符串就属于BASE64编码,但是与此同时它也有可能是一个普通的字符串,而刚好也符合BASE64的编码规则而已。所以至于按照哪种解码方式解,就要看编码的人想不想让你用BASE64规则解,还是想让你用UTF-8的编码方式解。
小结
本篇文章主要介绍一下BASE64编码的规则,同时也解释了上一篇文章中的问题。