python struct模組
struct模組的內容不多,也不是太難,下面對其中最常用的方法進行介紹:
struct.pack
struct.pack用於將Python的值根據格式符,轉換為字串(因為Python中沒有位元組(Byte)型別,可以把這裡的字串理解為位元組流,或位元組陣列)。其函式原型為:struct.pack(fmt, v1, v2, ...),引數fmt是格式字串,關於格式字串的相關資訊在下面有所介紹。v1, v2, ...表示要轉換的python值。下面的例子將兩個整數轉換為字串(位元組流):
- import struct
- a = 20
- b = 400
- str = struct.pack("ii", a, b)
- print'length:', len(str)
- print str
- print repr(str)
- #---- result
- #length: 8
- # ----這裡是亂碼
- #'/x14/x00/x00/x00/x90/x01/x00/x00'
格式符"i"表示轉換為int,'ii'表示有兩個int變數。進行轉換後的結果長度為8個位元組(int型別佔用4個位元組,兩個int為8個位元組),可以看到輸出的結果是亂碼,因為結果是二進位制資料,所以顯示為亂碼。可以使用python的內建函式repr來獲取可識別的字串,其中十六進位制的0x00000014, 0x00001009分別表示20和400。
struct.unpack
struct.unpack做的工作剛好與struct.pack相反,用於將位元組流轉換成python資料型別。它的函式原型為:struct.unpack(fmt, string),該函式返回一個元組。 下面是一個簡單的例子:
- str = struct.pack("ii", 20, 400)
- a1, a2 = struct.unpack("ii", str)
- print'a1:', a1
- print'a2:', a2
- #---- result:
- #a1: 20
- #a2: 400
struct.calcsize
struct.calcsize用於計算格式字串所對應的結果的長度,如:struct.calcsize('ii'),返回8。因為兩個int型別所佔用的長度是8個位元組。
struct.pack_into, struct.unpack_from
這兩個函式在Python手冊中有所介紹,但沒有給出如何使用的例子。其實它們在實際應用中用的並不多。Google了很久,才找到一個例子,貼出來共享一下:
- import struct
- from ctypes import create_string_buffer
- buf = create_string_buffer(12)
- print repr(buf.raw)
- struct.pack_into("iii", buf, 0, 1, 2, -1)
- print repr(buf.raw)
- print struct.unpack_from('iii', buf, 0)
- #---- result
- #'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'
- #'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'
- #(1, 2, -1)
關於格式字串
在Python手冊中,給出了C語言中常用型別與Python型別對應的格式符:
格式符 | C語言型別 | Python型別 | 注 |
---|---|---|---|
x | pad byte | no value | |
c | char | string of length 1 | |
b | signed char | integer | |
B | unsigned char | integer | |
? | _Bool | bool | |
h | short | integer | |
H | unsigned short | integer | |
i | int | integer | |
I | unsigned int | integer or long | |
l | long | integer | |
L | unsigned long | long | |
q | long long | long | |
Q | unsigned long long | long | |
f | float | float | |
d | double | float | |
s | char[] | string | |
p | char[] | string | |
P | void * | long |
具體內容請參考Python手冊 struct 模組