基于自己的学习顺序,现在来理一下Http中的编码,先谈谈平时项目使用很多的Base64算法。
要知道,任何数据在本质上都是二进制数据,也就是"0100011"这样的,之所以能显示为我们看到的现在的文字,是因为人们规定了对各种对二进制数据的解释方法,比如说在ASCII里:
- “01000001”是“A”
- “01000010”是“B”
- “01000011”是“C”
而Base64则就是重新解释了这些二进制数据,以6位对应一个字符的方式来解释,这样原来3个字符就变成了4个字符(83=24,24/6=4),而计算机本身是以8位来描述字符的,这样,对新的4个字符,存到内存就是48=32位,相当于Base64会增大数据量。
对照着Base64索引表,我们来做一次运算:
A | B | C | - | |
---|---|---|---|---|
ASCII | 104 | 97 | 10 | - |
8bit字节 | 01000001 | 01000010 | 01000011 | - |
6bit字节 | 010000 | 010100 | 001001 | 000011 |
对应Base64字符 | Q | U | J | D |
从例子上可以看到,“ABC”经过Base64变成了“QUJD”。需要说明的是,对二进制数据进行处理,是每 3 个字节一组(如果字节数不能被 3 整除,则用 0 补位),这里是刚好3*8=24能被6整除,所以3个字符只编程4个。
“ABC”
实际代码里“ABC”就转成了“QUJD”,那么对于“ABCD”呢,按之前说的是3个字符为一对,那“t”单独为一对,那最终结果应该是8个。
image.png
再说一下,如果被编码字符长度不是 3 的倍数的时候,则都用 0 代替,对应的输出字符为 =,而不是查表所得的 A。
最后总结一下步骤:
- 获取字符串每个字符的 ASCII 码,如果字符数不能被 3 整除,则末尾补 0
- 将步骤 1 获取的 ASCII 码转为 8 位 二进制码
- 每 6 bits 为一组,对照上面的 base64 索引表,得到编码后的字符串
网友评论