最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用base64模塊進(jìn)行二進(jìn)制數(shù)據(jù)編碼詳解

 更新時(shí)間:2018年01月11日 11:14:48   作者:GanZiQim  
這篇文章主要介紹了Python使用base64模塊進(jìn)行二進(jìn)制數(shù)據(jù)編碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下

前言

昨天團(tuán)隊(duì)的學(xué)妹來(lái)問(wèn)關(guān)于POP3協(xié)議的問(wèn)題,所以今天稍稍研究了下POP3協(xié)議的格式和Python里面的poplib。而POP服務(wù)器往回傳的數(shù)據(jù)里有一部分需要用到Base64進(jìn)行解碼,所以就順便看了下Python里面的base64模塊。

本篇先講一下base64模塊,該模塊提供了關(guān)于Base16,Base32,Base64,Base85和Ascii85的編碼和解碼相關(guān)的函數(shù)。有關(guān)poplib模塊的內(nèi)容,會(huì)在后面發(fā)上來(lái)。嗯,又挖了一個(gè)坑,這輩子挖的坑填不完了...

以下內(nèi)容摘自http://bbs.chinaunix.net/thread-1150250-1-1.html,詳細(xì)說(shuō)明了為什么回傳的數(shù)據(jù)會(huì)先經(jīng)過(guò)Base64編碼:

由於歷史原因,Internet上有些郵件系統(tǒng)只支援7Bit的字元傳輸,而漢字的內(nèi)碼是8Bit的,當(dāng)在電子郵件中發(fā)送中文時(shí),如果經(jīng)過(guò)這些只支援7Bit字元的郵件系統(tǒng),便會(huì)將漢字內(nèi)碼的第八位元的1全部變成0。
以”中文”兩字為例,HEX為A4A4A4E5,當(dāng)最高位元被清掉時(shí)就會(huì)變成24242465,也就是”$$$e”。telnet也存在這樣子的問(wèn)題。

除了中文郵件外,使用電子郵件傳送圖片、程式、壓縮文件等也會(huì)發(fā)生這個(gè)問(wèn)題。所以在電子郵件中一般採(cǎi)用各種郵件編碼方式來(lái)解決這個(gè)問(wèn)題,將8Bit按照一定的規(guī)則進(jìn)行編碼,便可以完好地通過(guò)只支持7Bit字元的郵件系統(tǒng)。

常見(jiàn)的郵件編碼有UU與MIME,而MIME(Multipurpose Internet Mail Extentions)一般翻譯成「多媒體傳送模式」,顧名思義,它標(biāo)榜的就是可以傳送多媒體型式的檔案,可以在一封mail中附加各種型式檔案一起送出。

MIME定義兩種編碼方法:Base64與QP(Quote-Printable),兩者使用時(shí)機(jī)不同,QP的規(guī)則是對(duì)於資料中的7bits無(wú)須重複encode,僅8bits資料轉(zhuǎn)成7bits。QP編碼適用於非US-ASCII的文字內(nèi)容,例如我們的中文檔案,而Base64的編碼規(guī)則,是將整個(gè)檔案重新編碼,編成7bits,它是用於傳送binary檔案時(shí)使用。由於編碼的方式不同,會(huì)影響編碼之後的檔案大小。有些較懶惰的軟體便都一律採(cǎi)用Base64編碼了。

Base64

base64模塊提供了6個(gè)函數(shù)用于Base64的編碼和解碼,可以將他們分為三組。

base64.b64encode(s, altchars=None)
base64.b64decode(s, altchars=None, validate=False)

參數(shù)s代表需要編碼/解碼的數(shù)據(jù)。其中b64encode的參數(shù)s的類型必須是字節(jié)包(bytes)。b64decode的參數(shù)s可以是字節(jié)包(bytes),也可以是字符串(str)。

由于Base64編碼后的數(shù)據(jù)中可能會(huì)含有'+'或者'/'兩個(gè)符號(hào),如果編碼后的數(shù)據(jù)用于url或者文件系統(tǒng)的路徑中,就可能會(huì)導(dǎo)致Bug。所以base64模塊提供了將編碼后的數(shù)據(jù)中'+'和'/'進(jìn)行替換的方法。

參數(shù)altchars必須是長(zhǎng)度為2的字節(jié)包,這兩個(gè)符號(hào)會(huì)用于替換編碼后數(shù)據(jù)中的'+'和'/'。這個(gè)參數(shù)默認(rèn)是None。

參數(shù)validate默認(rèn)為False。如果它為True時(shí),base64模塊在進(jìn)行解碼前會(huì)先檢查s中是否有非base64字母表中的字符,如果有的話則拋出錯(cuò)誤binascii.Error: Non-base64 digit found。

如果數(shù)據(jù)的長(zhǎng)度不正確則會(huì)拋出錯(cuò)誤binascii.Error: Incorrect padding。

>>> import base64
>>> x = base64.b64encode(b'test')
>>> x
b'dGVzdA=='
>>> base64.b64decode(x)
b'test'

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

這組函數(shù)會(huì)直接將參數(shù)s傳到上一組函數(shù)中。

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

這組函數(shù)同樣基于第一組函數(shù),但進(jìn)行編碼后會(huì)將輸出數(shù)據(jù)中的'+'和'/'替換為'-‘和'_'。解碼前則將數(shù)據(jù)中的'-‘和'_'替換為'+'和'/'。

另,Base64編碼還會(huì)產(chǎn)生一個(gè)符號(hào)'=',這個(gè)符號(hào)用于將數(shù)據(jù)長(zhǎng)度填充到4的倍數(shù)。

Base32

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

參數(shù)s與Base64一致。

Base32編碼后的字符范圍為[2-7A-Z],是不支持小寫字母的。不過(guò)當(dāng)參數(shù)casefold為True時(shí),Base32解碼時(shí)可以接受小寫字母的輸入。但是為了安全考慮,這個(gè)參數(shù)默認(rèn)為False。

Base32的解碼同時(shí)還允許將數(shù)字0替換為大寫字母O,把數(shù)字1替換為大寫字母I或者L。參數(shù)map01可以指定將數(shù)字1替換為哪個(gè)字符(源碼中并沒(méi)有限定必須是字母I或者L其中之一),當(dāng)這個(gè)參數(shù)非None時(shí),數(shù)字0總是會(huì)被替換為字母O。同樣為了安全考慮,這個(gè)參數(shù)默認(rèn)為None。

Base16

base64.b16encode(s)
base64.b16decode(s, casefold=False)

Base16編碼后的字符范圍為[0-9A-F]。

參數(shù)s和casefold的作用與Base32一致。

Base85

base64.b85encode(b, pad=False)
base64.b85decode(b)

參數(shù)b為用于編碼/解碼的數(shù)據(jù),類型要求跟Base64的參數(shù)s一致。

參數(shù)pad為True時(shí),在編碼前會(huì)用b'\0'將數(shù)據(jù)填充到長(zhǎng)度為4的倍數(shù)。不過(guò)在解碼的時(shí)候不會(huì)移除這些填充數(shù)據(jù)。

這組函數(shù)是在Python3.4之后新增的。

Ascii85

base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

參數(shù)b為用于編碼的數(shù)據(jù),類型必須為bytes。

參數(shù)foldspaces為True時(shí)會(huì)用b'y'來(lái)表示4個(gè)連續(xù)的空格。

參數(shù)wrapcol為一個(gè)整數(shù),當(dāng)wrapcol非0時(shí),這個(gè)整數(shù)控制編碼后的輸出每多少個(gè)字符添加一個(gè)換行符b'\n'。

參數(shù)pad為True時(shí),數(shù)據(jù)在編碼前會(huì)用b'\0'填充到長(zhǎng)度為4的倍數(shù)。解碼的時(shí)候不會(huì)移除這些填充數(shù)據(jù)。

參數(shù)adobe指定了數(shù)據(jù)是否采用Adobe的格式。Adobe Ascii85的編碼數(shù)據(jù)由<\~和\~>包圍起來(lái),如果這個(gè)參數(shù)為True,返回的數(shù)據(jù)會(huì)加上這對(duì)符號(hào)。

base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v')

參數(shù)b為用于編碼的數(shù)據(jù),類型可以為bytes或者str。

參數(shù)foldspaces為True時(shí)會(huì)用b'y'來(lái)表示4個(gè)連續(xù)的空格。

參數(shù)adobe指定了數(shù)據(jù)是否采用Adobe的格式。Adobe Ascii85的編碼數(shù)據(jù)由<\~和\~>包圍起來(lái),如果這個(gè)參數(shù)為True,解碼前base64會(huì)先去掉這對(duì)符號(hào)。

參數(shù)ignorechars指定了解碼時(shí)需要忽略掉的字符。默認(rèn)包含了ASCII中所有的空白符。

這組函數(shù)是在Python3.4之后新增的。

base64模塊的官方文檔中提到:Base85和Ascii85使用5個(gè)字符編碼4個(gè)字節(jié),而Base64使用6個(gè)字符編碼4個(gè)字節(jié)(實(shí)際上是4個(gè)字符編碼3個(gè)字節(jié)),當(dāng)空間不充裕時(shí)前兩者會(huì)比Base64更高效。

舊API

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

base64.encode(input, output)
base64.decode(input, output)

這組函數(shù)使用二進(jìn)制文件作為數(shù)據(jù)源,并將編碼/解碼后的數(shù)據(jù)寫入二進(jìn)制文件。

base64.encodebytes(s)
base64.decodebytes(s)

encodebytes和b64encode在內(nèi)部都是調(diào)用的binascii模塊的b2a_base64,只不過(guò)encodebytes調(diào)用b2a_base64時(shí)newline參數(shù)使用默認(rèn)值True。也就是說(shuō),encodebytes在輸出數(shù)據(jù)的時(shí)候,每76個(gè)字節(jié)會(huì)添加一個(gè)換行符b'\n'。

decodebytes和默認(rèn)參數(shù)下的b64decode基本一致。只有參數(shù)類型的檢查不一樣,decodebytes只支持bytes類型的數(shù)據(jù)。

base64.encodestring(s)
base64.decodestring(s)

這組函數(shù)在Python3.1之后就廢棄了,目前會(huì)直接調(diào)用上一組函數(shù)。

總結(jié)

base64模塊提供了對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼的接口,其中包括了標(biāo)準(zhǔn)的Base64,Base32,Base16和事實(shí)標(biāo)準(zhǔn)Ascii85和Base85。通過(guò)學(xué)習(xí)這個(gè)模塊,順便學(xué)習(xí)了一下二進(jìn)制數(shù)據(jù)編碼的各種細(xì)節(jié),感受頗深。有時(shí)候我們自以為了解計(jì)算機(jī),了解互聯(lián)網(wǎng),其實(shí)每個(gè)人看到的都只是滄海一粟,不值一提。這個(gè)領(lǐng)域?qū)τ谖襾?lái)說(shuō)還有很多未知,是等待探索的,而我也不會(huì)停止探索的腳步。

以上就是本文關(guān)于Python使用base64模塊進(jìn)行二進(jìn)制數(shù)據(jù)編碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • python 有效的括號(hào)的實(shí)現(xiàn)代碼示例

    python 有效的括號(hào)的實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了python 有效的括號(hào)的實(shí)現(xiàn)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Pytest+Yaml+Excel?接口自動(dòng)化測(cè)試框架的實(shí)現(xiàn)示例

    Pytest+Yaml+Excel?接口自動(dòng)化測(cè)試框架的實(shí)現(xiàn)示例

    本文主要介紹了Pytest+Yaml+Excel?接口自動(dòng)化測(cè)試框架,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 怎樣保存模型權(quán)重和checkpoint

    怎樣保存模型權(quán)重和checkpoint

    這篇文章主要介紹了如何保存模型權(quán)重和checkpoint,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python爬取音頻下載的示例代碼

    python爬取音頻下載的示例代碼

    這篇文章主要介紹了python爬取音頻下載的示例代碼,幫助大家更好的理解和學(xué)習(xí)python爬蟲,感興趣的朋友可以了解下
    2020-10-10
  • 使用基于Python的Tornado框架的HTTP客戶端的教程

    使用基于Python的Tornado框架的HTTP客戶端的教程

    這篇文章主要介紹了制作一個(gè)基于Python的Tornado框架的HTTP客戶端的教程,Tornado的異步特性使其能夠獲得很好的性能,需要的朋友可以參考下
    2015-04-04
  • python進(jìn)階之協(xié)程你了解嗎

    python進(jìn)階之協(xié)程你了解嗎

    這篇文章主要為大家詳細(xì)介紹了python進(jìn)階之協(xié)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • python操作微信自動(dòng)發(fā)消息的實(shí)現(xiàn)(微信聊天機(jī)器人)

    python操作微信自動(dòng)發(fā)消息的實(shí)現(xiàn)(微信聊天機(jī)器人)

    這篇文章主要介紹了python操作微信自動(dòng)發(fā)消息(微信聊天機(jī)器人),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python中的Numpy入門教程

    Python中的Numpy入門教程

    這篇文章主要介紹了Python中的Numpy入門教程,著重講解了矩陣中的數(shù)組操作,需要的朋友可以參考下
    2014-04-04
  • Python設(shè)計(jì)模式之觀察者模式原理與用法詳解

    Python設(shè)計(jì)模式之觀察者模式原理與用法詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之觀察者模式,簡(jiǎn)單講述了觀察者模式的概念、原理并結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)與使用方法,需要的朋友可以參考下
    2019-01-01
  • Python實(shí)現(xiàn)截屏的函數(shù)

    Python實(shí)現(xiàn)截屏的函數(shù)

    這篇文章主要介紹了Python實(shí)現(xiàn)截屏的函數(shù),可實(shí)現(xiàn)Python針對(duì)屏幕的截屏功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

双桥区| 乃东县| 长寿区| 安乡县| 厦门市| 香港 | 九台市| 宿州市| 德清县| 富平县| 顺昌县| 大姚县| 赣榆县| 平武县| 拜城县| 宝山区| 华亭县| 招远市| 卓尼县| 安陆市| 张北县| 永城市| 新竹市| 五莲县| 两当县| 宝清县| 宣威市| 鹤岗市| 西青区| 乐清市| 彩票| 偃师市| 杂多县| 田东县| 西盟| 海林市| 雅安市| 乡宁县| 静海县| 武义县| 陆丰市|