平常工作中,大家对base64肯定不陌生。
但作为程序员,只会对其使用还是远远不够的,本着知其然知其所以然,看了下base64的编码原理,在此做个笔记。
首先,说一下base64的用途,base64编码是将二进制字节流编码为可打印的64个字符。有些网络传输并不支持二进制编码的字节流的传输,若要解决此问题,就可以用base64编码。另外,base64可以作为简单的加密工具。
原理:
众所周知,传统的一个字节占8位,base64是将原先的二进制字节流以6位为分割,然后在经过base64字符编码对照表,编码为可打印的字符串。
base64字符编码对照表:
举个例子:
字符 ‘z’,二进制为
>>> bin(ord('z'))
'0b1111010'
即:0111 1010
base64编码,以6位分割
第一个字符为:0001 1110,10进制为30,对应base64字符编码对照表:‘e’
第二个字符为:0010 0000,10进制为32,对应base64字符编码对照表:‘g’
base64编码的一个字节6位,传统的一个字节8位,最小公倍数为24。那么base64编码最小单位即为24/6=4个字符
由于‘z’后面bit位都是0,base64约定以‘=’代替
上述还可以写为:
以24位,8位分割表示:
01111010 00000000 00000000
以24位,6位分割表示:
011110 100000 000000 000000
6位如何以8位形式表示,在前面补0,即:
0001 1110 0010 0000 0000 0000 0000 0000
得到上述结果
因此,‘z’经过base64编码得到:‘eg==’
用python验证一下:
>>> base64.b64encode("z")
'eg=='
上述即为base64编码原理
在python中,base64有标准模块,我们可以直接使用
import base64
使用方式:
编码
>>> base64.b64encode("z")
'eg=='
解码
>>> base64.b64decode('eg==')
'z'
模块中我们可以看到,除了b64encode,还有b32encode,b16encode,这些编码原理都是相同的。
b32取的是5位分割,5和8的最小公倍数为40,那么b32的最小单位为40/5=8个字符,缺失以‘=’补齐
b16去的是4位分割,4和8的最小公倍数为8,那么b16的最小单位为8/4=2个字符
结束!!!