Python base64

Posted 凌晨四点的蓝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、网页中传输少量二进制数据。

 

 

以上是关于Python base64的主要内容,如果未能解决你的问题,请参考以下文章

C#解码base64编码的二进制数据的代码

使用OpenSSL进行Base64编码和解码

阅读python的base64.py源代码

python实现base64算法加密

python小白 想问以下代码是如何实现base64解码的

无法在 Python 中使用 base64 编码数据