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对象。
本文介绍了Python中的struct模块,该模块用于从字符串创建和提取打包的二进制数据。文章详细解释了如何使用pack和unpack函数,并给出了具体的格式字符及其含义。此外,还提供了向二进制文件写入数据及从中读取数据的例子。
342

被折叠的 条评论
为什么被折叠?



