No.11 Python Struct 模組使用
阿新 • • 發佈:2018-12-26
Python提供了一個struct
模組來解決bytes
和其他二進位制資料型別的轉換
函式 | return | explain |
---|---|---|
pack(fmt,v1,v2…) | string | 按照給定的格式(fmt),把資料轉換成字串(位元組流),並將該字串返回. |
pack_into(fmt,buffer,offset,v1,v2…) | None | 按照給定的格式(fmt),將資料轉換成字串(位元組流),並將位元組流寫入以offset開始的buffer中.(buffer為可寫的緩衝區,可用array模組) |
unpack(fmt,v1,v2…..) | tuple | 按照給定的格式(fmt)解析位元組流,並返回解析結果 |
pack_from(fmt,buffer,offset) | tuple | 按照給定的格式(fmt)解析以offset開始的緩衝區,並返回解析結果 |
calcsize(fmt) | size of fmt | 計算給定的格式(fmt)佔用多少位元組的記憶體,注意對齊方式 |
比較重要的是pack()
和unpack()
兩個函式,上表中的format格式如下:
Character | Byte order | Size | Alignment |
---|---|---|---|
@ |
native | native | native |
= |
native | standard | none |
< |
little-endian | standard | none |
> |
big-endian | standard | none |
! |
network (= big-endian) | standard | none |
Format | C Type | Python type | Standard size | Notes |
---|---|---|---|---|
x |
pad byte | no value | ||
c |
char |
string of length 1 | 1 | |
b |
signed char |
integer | 1 | |
B |
unsigned char |
integer | 1 | |
? |
_Bool |
bool | 1 | |
h |
short |
integer | 2 | |
H |
unsigned short |
integer | 2 | |
i |
int |
integer | 4 | |
I |
unsigned int |
integer | 4 | |
l |
long |
integer | 4 | |
L |
unsigned long |
integer | 4 | |
q |
long long |
integer | 8 | q和Q只適用於64位機器; |
Q |
unsigned long long |
integer | 8 | q和Q只適用於64位機器; |
f |
float |
float | 4 | |
d |
double |
float | 8 | |
s |
char[] |
string | ||
p |
char[] |
string | ||
P |
void * |
integer |
每個格式前可以有一個數字,表示這個型別的個數,如s格式表示一定長度的字串,4i表示四個int
struct
的pack
函式把任意資料型別變成bytes
:
import struct
print(struct.pack("<i",123456))
print(struct.pack("<3s",b'hello'))
print(struct.pack("<5sl",b'hello',123456))
b'@\xe2\x01\x00'
b'hel'
b'[email protected]\xe2\x01\x00'
unpack
把bytes
變成相應的資料型別:
import struct
mybytes = struct.pack("<5sl",b'hello',123456)
mystr = struct.unpack("<5sl",mybytes)
print(mystr)
(b'hello', 123456)
mybytes
位元組流中有兩個部分,一個是長度為5的string型別,一個是4個byte
的long
如果想檢視給定的格式佔多少個位元組,可以使用calcsize(fmt)
,用法如下:
print 'l:',calcsize('l')
print '@i:',calcsize('@i')
print '=i:',calcsize('=i')
print '>s:',calcsize('>s')
print '<q:',calcsize('<q')