Python base64

base64表示一种使用64个字符表示任意二进制数据的方法,注意64个字符是可以自己定义的

参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017684507717184

  用记事本打开exejpgpdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

原理

  首先准备一个包含64个字符的数组,这就相当于Ascii编码中的Ascii表,根据下面的算法得出的数过来查表,得到的一个一个的字符就是最后将二进制进行base64编码得到的字符串

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

  然后,对二进制数据进行处理,每3个字节一组,一个字节是8bit,一共是3x8=24bit,又将这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、网页中传输少量二进制数据。

 

 

posted @ 2019-09-29 22:51  凌晨四点的蓝  阅读(1516)  评论(0编辑  收藏  举报