本篇內容主要介紹二進制數據的編解碼問題,涉及的模塊有 base6四、struct、chardet。html
base64
模塊主要提供將二進制數據編碼爲可打印的 ASCII 字符以及將這些編碼解碼回二進制數據的函數。本篇主要介紹模塊中的兩個函數 b64encode()
和 b64decode()
。python
>>> import base64 # 編碼 >>> s = b'hello world' >>> base64.b64encode(s) b'aGVsbG8gd29ybGQ=' # 解碼 >>> s1 = b'aGVsbG8gd29ybGQ=' >>> base64.b64decode(s1) b'hello world'
b64encode()
的做用是對 bytes-like object
進行 Base64
編碼,並返回編碼後的 bytes
;b64decode()
的做用是解碼經 Base64
編碼過的 bytes-like object
或者 ASCII 字符串,並返回解碼過的 bytes
。微信
更多關於 base64
模塊的詳細信息,可參考:網絡
https://docs.python.org/3.8/library/base64.htmlide
struct
模塊,能夠執行 Python 值和以 Python bytes
對象表示的 C 結構之間的轉換。這能夠用來處理存儲在文件中或者是從網絡等其餘來源獲取的二進制文件。接下來主要介紹 pack()
和 unpack()
兩個函數的使用方法.函數
>>> from struct import Struct >>> record_struct = Struct('>hhl') >>> record_struct.pack(1,2,3) b'\x00\x01\x00\x02\x00\x00\x00\x03' >>> record_struct.unpack(b'\x00\x01\x00\x02\x00\x00\x00\x03') (1, 2, 3)
pack
函數是把數據類型變爲 bytes
,而 unpack
是將 bytes
變爲相應的數據類型。編碼
這裏經過建立實例 Struct
,指定一個格式 >hhl
,這裏 >
表示 big-endian
大端模式,也就是將高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。h
表示對應 2 字節帶符號整數,對應 C 的 short
類型;l
表明 4 字節帶符號整數,對應 C 的 long
類型。code
關於 struct
模塊定義的數據類型能夠參考 Python 的官方文檔:orm
https://docs.python.org/3/library/struct.html#format-stringshtm
https://docs.python.org/3/library/struct.html#format-characters
pack()
和 unpack()
操做可以以模塊級別的函數被調用,示例以下:
>>> from struct import * >>> pack('hhl', 1, 2, 3) b'\x01\x00\x02\x00\x03\x00\x00\x00' >>> unpack('hhl', b'\x01\x00\x02\x00\x03\x00\x00\x00') (1, 2, 3)
這樣的操做,在代碼一樣結構出現多個地方的時候,須要屢次書寫格式。建議建立 Struct
實例,指定格式代碼後全部操做集中處理。這樣也可以更簡單地維護代碼。
chardet
是一個第三方庫,是一個通用字符編碼檢測器。顧名思義,便是用以檢測編碼。
使用 chardet
須要安裝(如果安裝了 Anaconda,能夠跳過),使用以下命令:
$ pip install chardet
舉例說明,如何使用 chardet 進行編碼檢測。示例代碼以下:
>>> import chardet >>> chardet.detect(b'Hello world!') {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
檢測出的編碼是 ascii,這裏有個參數 confidence,這裏的 1.0(便是 100% ) 表示檢測的機率。
嘗試檢測 GBK 編碼的中文:
>>> data = "黃河西來決崑崙,咆哮萬里觸龍門".encode('gbk') >>> chardet.detect(data) {'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
檢測的編碼是 GB2312,注意到 GBK 是 GB2312 的超集,二者是同一種編碼,檢測的機率是 99%,language 字段指出的語言是 Chinese。
可嘗試對日文進行檢測:
>>> data = 'いちだい さんぜん だいせん せかい'.encode('euc-jp') >>> chardet.detect(data) {'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
使用 chardet
模塊進行編碼檢測,可以有效獲取編碼進行轉換,方便後續的使用。
下面的連接羅列了 chardet
支持的編碼列表:
https://chardet.readthedocs.io/en/latest/supported-encodings.html
以上就是本篇的主要內容
歡迎關注微信公衆號《書所集錄》