Python base64
base64表示一种使用64个字符表示任意二进制数据的方法,注意64个字符是可以自己定义的
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184
用记事本打开exe
、jpg
、pdf
这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
原理
首先准备一个包含64个字符的数组,这就相当于Ascii编码中的Ascii表,根据下面的算法得出的数过来查表,得到的一个一个的字符就是最后将二进制进行base64编码得到的字符串
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
然后,对二进制数据进行处理,每3个字节一组,一个字节是8bit,一共是3x8=24
bit,又将这3组划为4组,每组正好6个bit:
然后将这6bit转为10进制的数,(6bit的二进制数刚好能表示0-63,就是64个数 )作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
使用
以上就是base的编码原理,所以,根据自己定义的64个字符串的不同,同样的二进制文件可能也有不同的结果
另外,上面分组的过程中,我们将二进制文件分为3个字节的组,那么当二进制的长度不是3的倍数会怎么办呢,Base64用\x00
字节在末尾补足后,再在编码的末尾加上1个或2个=
号,表示补了多少字节,解码的时候,会自动去掉。
>>> base64.b64encode(b'\x00\x00\x00') b'AAAA' >>> base64.b64encode(b'\x00\x00') b'AAA='#就不查表了,直接用等号表示,这样并不会造成之前的字节中的数据丢失,因为在解码的时候,将等号变为相应的\x00,在通过表把base64编码转为二进制字节时,你会发现这样并不会 >>>
Python内置的base64
可以直接进行base64的编解码:
>>> import base64 >>> base64.b64encode(b'binary\x00string') b'YmluYXJ5AHN0cmluZw==' >>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==') b'binary\x00string'
由于标准的Base64编码后可能出现字符+
和/
,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+
和/
分别变成-
和_(略)
还可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码,不过,通常情况下完全没有必要。
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
由于=
字符也可能出现在Base64编码中,但=
用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=
去掉:
# 标准Base64: 'abcd' -> 'YWJjZA==' # 自动去掉=: 'abcd' -> 'YWJjZA'
去掉=
后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=
把Base64字符串的长度变为4的倍数,就可以正常解码了。(因为等号是怎么加的,加等号是为了 表示\x00
字节在末尾补足的个数)
Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。