转自:http://muxu303.blog.163.com/blog/static/51280192011224101232405/
python作为脚本语言中最给力的一种,集成了编译语言的功能性和脚本语言的灵活性,作为一种高级的解释性脚本语言,同时还具有程序语言的各种优点如:面向对象,可扩展,可移植,易学易用,强大的内存管理,有点少叙,本文介绍其对二进制数据的操作模块struct,无论是网络应用,还是文件存储,均可派上用场..
先来感性的认识一段代码:如下(输出为斜体)
--------------------------------------------------------------------------------
>>> import struct 【引入struct包】
>>> byte_buf = struct.pack("i5sc6s", 9527,"hello"," ","world!!") 【打包数据到byte_buf中,参数“i5sc6s”表示一个int型,长度为5的char组...】
>>> v1,v2,v3,v4 = struct.unpack("i5sc6s",byte_buf) 【解包到四个值】
>>> print v1,v2,v3,v4 【打印输出】
9527 hello world! 【最后一个感叹号没打印出来,因为格式化参数“i5sc6s“的6截断第二个感叹号】
--------------------------------------------------------------------------------
>>> byte_buf = struct.pack("i", 134) 【只对一个值打包】
>>> type(struct.unpack("i", byte_buf)) 【unpack返回的是tuple】
<type 'tuple'>
>>> struct.unpack("i", byte_buf)[0]
134
通过如上的演示,相信大家对该模块的用法已经掌握了,如下两表为该模块对应的,格式化时使用的数据类型,和一些特殊规则
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 | 4 |
考虑到c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了如下的选项用来表示不同的字节对其方式,如使用'@6si'表示4字节对齐,先6个char,再一个int型,共使用12个字节
Character | Byte order | Size and alignment |
---|---|---|
@ | native | native 4个字节对齐 |
= | native | standard 原字节数 |
< | little-endian | standard 原字节数 |
> | big-endian | standard 原字节数 |
! | network (= big-endian) | standard 原字节数 |