Python使用base64模块进行二进制数据编码详解

  

  

昨天团队的学妹来问关于POP3协议的问题,所以今天稍稍研究了下POP3协议的格式和Python里面的poplib。而流行服务器往回传的数据里有一部分需要用到Base64进行解码,所以就顺便看了下Python里面的Base64模块。

  

本篇先讲一下base64模块,该模块提供了关于Base16, Base32, base64, Base85和Ascii85的编码和解码相关的函数。有关poplib模块的内容,会在后面发上来。嗯,又挖了一个坑,这辈子挖的坑填不完了…

  

以下内容摘自http://bbs.chinaunix.net/thread - 1150250 - 1 - 1. - html,详细说明了为什么回传的数据会先经过Base64编码:

  

由於歷史原因,互联网上有些郵件系統只支援7位的字元傳輸,而漢字的內碼是8位的,當在電子郵件中發送中文時,如果經過這些只支援7位字元的郵件系統,便會將漢字內碼的第八位元的1全部變成0。
  中以“文”兩字為例,十六进制為A4A4A4E5,當最高位元被清掉時就會變成24242465,也就是“$ $ $ e”.telnet也存在這樣子的問題。
  

  

除了中文郵件外,使用電子郵件傳送圖片,程式,壓縮文件等也會發生這個問題。所以在電子郵件中一般採用各種郵件編碼方式來解決這個問題,將8位按照一定的規則進行編碼,便可以完好地通過只支持7位字元的郵件系統。
  

  

常見的郵件編碼有UU與MIME,而MIME(延续Multipurpose Internet Mail)一般翻譯成“多媒體傳送模式”,顧名思義,它標榜的就是可以傳送多媒體型式的檔案,可以在一封邮件中附加各種型式檔案一起送出。
  

  

MIME定義兩種編碼方法:Base64與QP (Quote-Printable)兩者使用時機不同,QP的規則是對於資料中的7位無須重複编码,僅8位資料轉成7 bits.qp編碼適用於非us - ascii的文字內容,例如我們的中文檔案,而Base64的編碼規則,是將整個檔案重新編碼,編成7位,它是用於傳送二进制檔案時使用。由於編碼的方式不同,會影響編碼之後的檔案大小。有些較懶惰的軟體便都一律採用Base64編碼了。

  

  

base64模块提供了6个函数用于base64的编码和解码,可以将他们分为三组。

  

base64。b64encode(年代,altchars=None)
  base64。b64decode(年代,altchars=None,验证=False)

  

参数年代代表需要编码/解码的数据,其中b64encode的参数年代的类型必须是字节包(字节).b64decode的参数年代可以是字节包(字节),也可以是字符串(str)。

  

由于Base64编码后的数据中可能会含有“+”或者‘/礁龇?如果编码后的数据用于url或者文件系统的路径中,就可能会导致错误。所以Base64模块提供了将编码后的数据中‘+’和‘/刑婊坏姆椒ā?/p>   

参数altchars必须是长度为2的字节包,这两个符号会用于替换编码后数据中的‘+’和‘/U飧霾问鲜敲挥小?/p>   

参数验证默认为假的。如果它为真时,base64模块在进行解码前会先检查年代中是否有非base64字母表中的字符,如果有的话则抛出错误binascii。错误:Non-base64数字。

  

如果数据的长度不正确则会抛出错误binascii。错误:错误的填充。

        在在在进口base64   在在在x=base64.b64encode (b不”)   在在在x   b 'dGVzdA=='   在在在base64.b64decode (x)   b不'      

base64.standard_b64encode (s)
  base64.standard_b64decode (s)

  

这组函数会直接将参数年代传到上一组函数中。

  

base64.urlsafe_b64encode (s)
  base64.urlsafe_b64decode (s)

  

这组函数同样基于第一组函数,但进行编码后会将输出数据中的‘+’和‘/婊晃?”和“_”。解码前则将数据中的“-”和“_”替换为‘+’和‘/?/p>   

另,Base64编码还会产生一个符号‘=?这个符号用于将数据长度填充到4的倍数。

  

  

base64.b32encode (s)
  base64。b32decode(年代,casefold=False, map01=None)

  

参数年代与Base64一致。

  

Base32编码后的字符范围为[2-7A-Z],是不支持小写字母的。不过当参数casefold为真时,Base32解码时可以接受小写字母的输入。但是为了安全考虑,这个参数默认为假的。

  

Base32的解码同时还允许将数字0替换为大写字母啊,把数字1替换为大写字母我或者L .参数map01可以指定将数字1替换为哪个字符(源码中并没有限定必须是字母我或者L其中之一),当这个参数非时,数字0总是会被替换为字母O .同样为了安全考虑,这个参数默认为None。

  

Python使用base64模块进行二进制数据编码详解