1. Python標准庫筆記(6) — struct模塊
struct模塊為Python提供了一個橋梁,使得Python數值與C語言結構體的Python字元串形式之間能夠輕松轉換。適用於處理存儲在文件中或網路連接中的二進制數據,以及其它數據源。
該模塊除了提供一個名為`Struct`的類外,還有多個模塊級函數處理結構化值。格式符是關鍵概念,與正則表達式相似,用於從字元串格式轉換為編譯表示形式。通常,實例化`Struct`類並調用其方法比直接調用模塊函數更高效。下面的例子都使用`Struct`類。
struct支持將數據打包成字元串,並能從字元串中逆向解包出數據。格式指定器需要整型、長整型、兩個位元組的字元串和浮點數。空格在編譯格式時會被忽略。此示例將打包的值轉換為十六進制位元組序列,並使用`binascii.hexlify()`方法列印。使用`unpack()`方法解包。打包的值傳給`unpack()`後,基本返回相同的值(浮點數有微小差異)。
默認情況下,pack使用本地C庫的位元組順序。格式化字元串的第一個字元用於表示填充數據的位元組順序、大小和對齊方式。默認使用`@`。本地位元組順序由當前主機系統決定,如Intel x86和AMD64使用小位元組序,Motorola 68000和PowerPC G5使用大位元組序,ARM和Intel安騰支持切換位元組序。使用`sys.byteorder`查看當前系統的位元組順序。
本地大小和對齊是由c編譯器的`sizeof`表達式決定的,與本地位元組順序對應。標准大小由格式符決定。示例如下。
格式符對照表如下。
打包和解包時,性能優化是關鍵。在性能要求高的場景中,可通過避免每次打包結構分配新緩沖區的開銷,優化`pack_into()`和`unpack_from()`方法。直接寫入預先分配的緩沖區是實現這一目標的有效策略。