Python 二進制數據

二進制數據


本篇內容主要介紹二進制數據的編解碼問題,涉及的模塊有 base6四、struct、chardet。html

base64


base64 模塊主要提供將二進制數據編碼爲可打印的 ASCII 字符以及將這些編碼解碼回二進制數據的函數。本篇主要介紹模塊中的兩個函數 b64encode()b64decode()python

b64encode() 和 b64decode()

>>> 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 編碼,並返回編碼後的 bytesb64decode() 的做用是解碼經 Base64 編碼過的 bytes-like object 或者 ASCII 字符串,並返回解碼過的 bytes微信

更多關於 base64 模塊的詳細信息,可參考:網絡

https://docs.python.org/3.8/library/base64.htmlide

struct


struct 模塊,能夠執行 Python 值和以 Python bytes 對象表示的 C 結構之間的轉換。這能夠用來處理存儲在文件中或者是從網絡等其餘來源獲取的二進制文件。接下來主要介紹 pack()unpack() 兩個函數的使用方法.函數

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 是一個第三方庫,是一個通用字符編碼檢測器。顧名思義,便是用以檢測編碼。

安裝 chardet

使用 chardet 須要安裝(如果安裝了 Anaconda,能夠跳過),使用以下命令:

$ pip install chardet

使用 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

參考資料


來源

  1. David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O’Reilly Media.2013.
  2. Luciano Ramalho.Fluent Python.O'Reilly Media.2015
  3. 「base64 — Base16, Base32, Base64, Base85 Data Encodings」.docs.python.org.Retrieved 26 January 2020
  4. 「struct — Interpret bytes as packed binary data」.docs.python.org.Retrieved 26 January 2020
  5. "Usage".chardet.readthedocs.io.Retrieved 28 January 2020
  6. "Supported encodings".chardet.readthedocs.io.Retrieved 28 January 2020
  7. 廖雪峯.「Python 教程」.liaoxuefeng.com.[2020-01-28].

以上就是本篇的主要內容

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索