Python/struct
< Python
有的時候需要用Python處理二進制數據,比如,存取文件、socket操作。可以使用Python的struct
模塊來完成。
struct
模塊中最重要的三個函數是pack()
, unpack()
, calcsize()
:
pack(fmt, v1, v2, ...)
按照給定的格式(fmt
),把數據封裝成字符串(實際上是類似於c結構體的字節流)unpack(fmt, string)
按照給定的格式(fmt
)解析字節流string
,返回解析出來的tuple
calcsize(fmt)
計算給定的格式(fmt
)占用多少字節的內存
格式描述
編輯struct
中支持的格式如下表:
Format | C 語言數據類型 | Python | 字節數 |
---|---|---|---|
x |
pad byte |
no value |
1 |
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 / long |
4 |
l |
long |
integer |
4 |
L |
unsigned long |
long |
4 |
q |
long long |
long |
8 |
Q |
unsigned long long |
long |
8 |
f |
float |
float |
4 |
d |
double |
float |
8 |
s |
char[] |
string |
1(表示一定長度的字符串,4s表示長度為4的字符串) |
p |
char[] |
string |
1 (表示的是pascal字符串) |
P |
void * |
long |
和機器字長相關 |
每個格式前可以有一個數字,表示個數。
可以用格式中的第一個字符來改變對齊方式.定義如下:
字符 | 字節順序 | 字節數和對齊方式 |
---|---|---|
@ |
native | native 湊夠4個字節 |
= |
native | standard 按原字節數 |
< |
little-endian | standard 按原字節數 |
> |
big-endian | standard 按原字節數 |
! |
network (= big-endian) | standard 按原字節數 |
例子
編輯import struct
# 定义数据
a = b"hello"
b = b"world!"
c = 20
d = 42.56
# 打包
binStr = struct.pack("5s6sif", a, b, c, d)
print (len(binStr))
binStr2 = struct.pack("i", c)
# 解包
e, f, g, h = struct.unpack("5s6sif", binStr)
print (e, f, g, h )
# 注意unpack返回的是tuple,如果不按规定格式书写,则返回值将改变类型
i, = struct.unpack("i", binStr2)
print (i)
i = struct.unpack("i", binStr2)
print (i)
# 计算转换字节长度
print (struct.calcsize("5s6sif"))