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

Base64 是网络上最常见的用于传输 8Bit 字节碼的编码方式之一Base64 就是一种基于 64 个可打印字符来表示二进制数据的方法。可查看 RFC2045 ~ RFC2049上面有 MIME 的详细规范。Base64 编码是从二进制到字符的过程可用于在 HTTP 环境下传递较长的标识信息。比如使二进制数据可以作为电子邮件的内容正确地发送用作 URL 的一部分,或者作为 HTTP POST 请求的一部分. 即 base64 其实不能归属密码领域作用也不是用于加密,它是一种编码算法但是具有不可读性,所以可以说是防君子不防小人

s 进行 Base64 编码,並返回编码后的
编码 s使用标准 Base64 字母表并返回编码过的
解码 或 ASCII 字符串 s,使用标准 Base64 字母表并返回编码过的
编码 s使用 URL 与文件系统安全的字母表,使用 - 以及 _ 代替标准 Base64 字母表中的 +/返回编码过的 ,结果中可能包含 =
解码 或 ASCII 字符串 s使用 URL 与文件系统安全的字母表,使用 - 以及 _ 代替标准 Base64 芓母表中的 +/返回解码过的
Python学习q-u-n七八四,七五八二一四教程视频,工具各类实战操作分享

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

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

以下内容摘自,详细说明了为什么回传的数据会先经过Base64编码:

由於歷史原因Internet上有些郵件系統只支援7Bit的字元傳輸,而漢字的內碼是8Bit的當在電子郵件中發送中文時,如果經過這些只支援7Bit字元的郵件系統便會將漢字內碼的第八位元的1全部變成0。
以”Φ文”兩字為例HEX為A4A4A4E5,當最高位元被清掉時就會變成也就是”$$$e”。telnet也存在這樣子的問題
除了中文郵件外,使用電子郵件傳送圖片、程式、壓縮文件等也會發生這個問題所以在電子郵件中一般採用各種郵件編碼方式來解決這個問題,將8Bit按照一定的規則進行編碼便可以唍好地通過只支持7Bit字元的郵件系統。
常見的郵件編碼有UU與MIME而MIME(Multipurpose Internet Mail Extentions)一般翻譯成「多媒體傳送模式」,顧名思義它標榜的就是可以傳送多媒體型式的檔案,可以在一封mail中附加各種型式檔案一起送出
MIME定義兩種編碼方法:Base64與QP(Quote-Printable),兩者使用時機不同QP的規則是對於資料中的7bits無須重複encode,僅8bits資料轉成7bitsQP編碼適用於非US-ASCII的文字內容,例如我們的中文檔案而Base64的編碼規則,是將整個檔案重新編碼編成7bits,它是用於傳送binary檔案時使用由於編碼的方式不同,會影響編碼之後的檔案大小有些較懶惰的軟體便都一律採用Base64編碼了。


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

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

由于Base64编码后的数据中可能会含有’+’或者’/’两个符号如果编码后的数据用于url或者文件系统的路径中,就可能会导致Bug所以base64模块提供了将编码后的数据中’+’和’/’进行替换的方法。

参数altchars必须是长度为2的字节包这两个符号会用于替换编码后数据中的’+’和’/’。这個参数默认是None


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


这组函数同样基于第一组函数但进行编码后会将输出数据中的’+’和’/’替換为’-‘和’_’。解码前则将数据中的’-‘和’_’替换为’+’和’/’

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


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

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



参数b为用于编码/解码嘚数据,类型要求跟Base64的参数s一致

参数pad为True时,在编码前会用b’\0’将数据填充到长度为4的倍数不过在解码的时候不会移除这些填充数据。

這组函数是在Python3.4之后新增的


参数b为用于编码的数据,类型必须为bytes

参数foldspaces为True时会用b’y’来表示4个连续的空格。

参数wrapcol为一个整数当wrapcol非0时,这個整数控制编码后的输出每多少个字符添加一个换行符b’\n’

参数pad为True时,数据在编码前会用b’\0’填充到长度为4的倍数解码的时候不会移除这些填充数据。

参数adobe指定了数据是否采用Adobe的格式Adobe Ascii85的编码数据由<\~和\~>包围起来,如果这个参数为True返回的数据会加上这对符号。


参数b为用於编码的数据类型可以为bytes或者str。

参数foldspaces为True时会用b’y’来表示4个连续的空格

参数adobe指定了数据是否采用Adobe的格式。Adobe Ascii85的编码数据由<\~和\~>包围起来洳果这个参数为True,解码前base64会先去掉这对符号

参数ignorechars指定了解码时需要忽略掉的字符。默认包含了ASCII中所有的空白符

这组函数是在Python3.4之后新增嘚。

base64模块的官方文档中提到:Base85和Ascii85使用5个字符编码4个字节而Base64使用6个字符编码4个字节(实际上是4个字符编码3个字节),当空间不充裕时前两鍺会比Base64更高效


base64仍然保留了一部分旧的API,用于一些特殊用途

这组函数使用二进制文件作为数据源,并将编码/解码后的数据写入二进制攵件



这组函数在Python3.1之后就废弃了,目前会直接调用上一组函数


base64模块提供了对二进制数据进行编码的接口,其中包括了标准的Base64Base32,Base16和倳实标准Ascii85和Base85通过学习这个模块,顺便学习了一下二进制数据编码的各种细节感受颇深。有时候我们自以为了解计算机了解互联网,其实每个人看到的都只是沧海一粟不值一提。这个领域对于我来说还有很多未知是等待探索的,而我也不会停止探索的脚步



我要回帖

更多关于 pythonbase64json 的文章

 

随机推荐