python的二進位制轉化模組

2022-01-04 09:00:02

在pyton中,通過struct模組來對二進位制進行轉換,主要包括兩大類函數,即用於打包的pack和用於解包的unpack。

其中,struct.pack的輸入格式為struct.pack(format, v1, v2, ...),其中format為格式字串,v1,v2..為將要轉成bytes的字元。

例如

>>> import struct
>>> struct.pack('i', 15)
b'\x0f\x00\x00\x00'
>>> struct.pack('iii', 15, 16, 17)
b'\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00'
>>> struct.pack('b', 255)   #b格式的取值範圍是-128到127
struct.error: byte format requires -128 <= number <= 127
>>> struct.pack('B', 200)
b'\xc8'
>>> struct.pack('B', 71)    #128以內可用ASCII表示
b'G'

i代表int,15對應的二進位制程式碼為F000,故其輸出為b\x0f\x00\x00\x00。當格式字串為iii時,說明要將三個數位以整數型別轉化為二進位制。

其中,格式化字串中的每個字元都代表一種資料型別,其中整型相關的字元如下,左側為帶符號整型,右側為無符號整型

C語言型別C語言型別標準大小
bsigned charBunsigned char1
hshortHunsigned short2
iintIunsigned int4
llongLunsigned long4
qlong longQunsigned long long8
nssize_tNsize_t

其他型別

格式C 型別Python 型別標準大小
x填充位元組
cchar長度為1的位元組串
?_Boolbool1
efloat2
ffloatfloat4
ddoublefloat8
schar[]位元組串
pchar[]位元組串
Pvoid*整數

struct中提供了獲取標準大小的函數,calcsize:

>>> struct.calcsize('B')
1
>>> struct.calcsize('i')
4

除了宣告被格式化時的資料型別,struct還可以指定對齊方式,例如

>>> struct.pack("i",15)
b'\x0f\x00\x00\x00'
>>> struct.pack(">i",15)    #小端序
b'\x00\x00\x00\x0f'
>>> struct.pack("<i",15)    #大端序
b'\x0f\x00\x00\x00'

其對應字元的含義分別為

@=<>!
本機本機小端大端網路(大端)

其中預設為@,即本機位元組順序。

在熟悉了pack之後,與之對偶的unpack也就沒啥難度了

>>> test = struct.pack("III",125,1255,12555)
>>> struct.unpack("III",test)
(125, 1255, 12555)

除了packunpackstruct模組還提供了C語言風格的一對函數pack_intounpack_from,二者的宣告分別為

struct.pack_into(format, buffer, offset, v1, v2, ...)
struct.unpack_from(format, /, buffer, offset=0)

其中buffer表示緩衝流,在pack_into中,將v1,v2...offset的偏置打包入buffer中;在unpack_from中,將buffer中的資料從offset處依次取出。

struct中封裝了用於二進位制處理的類Struct,按照以往經驗,其pack函數的實現方法很有可能是下面這種

def pack(format,*args):
    return Struct(format).pack(args)

其中Struct的初始化方法就是輸入一個格式化字串,例如

>>> s = struct.Struct("III")
>>> s.pack(1,2,3)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'