Python的struct模块,用来从字符串创建和提取打包的二进制数据。


pack(fmt, v1, v2, ...) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)。


unpack(fmt, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple。


Format

C Type

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 or 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

p

char[]

string

1

P

void *

long

注1.q和Q只在机器支持64位操作时有意思

注2.每个格式前可以有一个数字,表示个数

注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串

注4.P用来转换一个指针,其长度和机器字长相关

注5.最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

Character

Byte order

Size and alignment

@

native

native            凑够4个字节

=

native

standard        按原字节数

<

little-endian

standard        按原字节数

>

big-endian

standard       按原字节数

!

network (= big-endian)

standard       按原字节数

向一个二进制文件中写入数据。

>>>F = open('data.bin', 'wb')
>>>import struct
>>>data = struct.pack('>i4sh',7,'spam',8)
>>>data
b'\x00\x00\x00\x07spam\x00\x08'
>>>F.write(data)
10
>>>F.close()


从一个二进制文件中读取数据

>>>F = open('data.bin', 'rb')
>>>data = F.read()
>>>data
b'\x00\x00\x00\x07spam\x00\x08'
>>>import struct
>>>values = struct.unpack('>i4sh',data)
>>>values
(7,'spam',8)

注意unpack返回的是一个tuple对象。