Python 的模塊 struct 支持字符串和二進制類型的轉換。
struct 提供了幾個便利的模塊級別的函數,你可以直接調用它們。類似正則表達式,你也可以使用類 Struct 直接編譯一個格式字符串,然後通過使用 Struct 實例對象調用方法,這樣會更有效率。
Packing 和 Unpacking
struct 通過 Packing 把內置的數據結構轉換成字節流。
執行:
Struct() 通過參數 格式字符串 構造一個 Struct 實例,然後調用 pack() 方法將內置類型轉換為字節流。
注意,格式字符串和 pack() 方法接收的數據是對應的,上例中,I 代表整數類型,佔 4 個字節,4s 包含 4 個字符,f 代表浮點類型,分別對象 pack() 方法傳入的三個參數。
以下表格描述了每個格式字符。
使用 unpack() 方法從字節流解析數據,返回 Python 內置類型。
執行:
上例中,首先使用 binascii 把二進制數據轉換為16進製表示的數據,然後傳入 unpack() 方法,返回內置類型元組。
緩存
Struct 通過字節流在不同的包中傳遞數據非常高效,還可以把字節數據緩存起來優化性能,方法 pack_into() 和 unpack_from() 支持寫入緩存和從中讀取。
執行:
上例中,通過 Struct 的屬性 size,確定了緩存的大小。
字節順序 Endianness
當數據 pack 成字節流的時候,默認使用系統內置的 c 庫確定字節順序,你也通過字節順序標識顯示的改變默認的行為。
執行:
上例使用前綴 ! 代表使用網絡順序(Network order)。
下面列出了 Struct 的一些字節順序編碼(byte order code)
- @ Native Order
- = Native Standard
- < Little-Endian
- > Big-Endian
- ! Network Order
閱讀更多 趣喜歡編程 的文章