Python使用struct处理二进制(pack和unpack用法)
2014-03-13 14:46
531 查看
[转]Python使用struct处理二进制(pack和unpack用法)
Leavea reply
转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html
这篇文章写的很好,所以无耻的转了。。
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体.
struct模块中最重要的三个函数是pack(), unpack(), calcsize()
?
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 | (3) |
B | unsigned char | integer | 1 | (3) |
? | _Bool | bool | 1 | (1) |
h | short | integer | 2 | (3) |
H | unsigned short | integer | 2 | (3) |
i | int | integer | 4 | (3) |
I | unsigned int | integer | 4 | (3) |
l | long | integer | 4 | (3) |
L | unsigned long | integer | 4 | (3) |
q | long long | integer | 8 | (2), (3) |
Q | unsigned long long | integer | 8 | (2), (3) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | string | ||
p | char[] | string | ||
P | void * | integer | (5), (3) |
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
CHARACTER | BYTE ORDER | SIZE | ALIGNMENT |
---|---|---|---|
@ | native | native | native |
= | native | standard | none |
< | little-endian | standard | none |
> | big-endian | standard | none |
! | network (= big-endian) | standard | none |
例子1:
结构体如下:
?
?
就通过一个unpack,现在id, tag, version, count里已经保存好我们的信息了.
同样,也可以很方便的把本地数据再pack成struct格式:
?
例子2:
?
再进行反操作,现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:
?
?
然后,当我们需要时可以再读出来,bytes=binfile.read()
再通过struct.unpack()解码成python变量:
?
注意:二进制文件处理时会碰到的问题
我们使用处理二进制文件时,需要用如下方法:
?
不同之处有两个地方:
第一,使用’r'的时候如果碰到’0x1A’,就会视为文件结束,这就是EOF。使用’rb’则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在’0X1A’,就只会读出文件的一部分。使用’rb’的时候会一直读到文件末尾。
第二,对于字符串x=’abc\ndef’,我们可用len(x)得到它的长度为7,\n我们称之为换行符,实际上是’0X0A’。当我们用’w'即文本方式写的时候,在windows平台上会自动将’0X0A’变成两个字符’0X0D’,’0X0A’,即文件长度实际上变成8.。当用’r'文本方式读取时,又自动的转换成原来的换行符。如果换成’wb’二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。’0X0D’又称回车符。linux下不会变。因为linux只使用’0X0A’来表示换行。
相关文章推荐
- [转]Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)
- Python使用struct处理二进制(pack和unpack用法)