Archive

标签为 ‘struct’的文章

python的struct模块

“python是一门非常简洁的语言”
好吧,这种简洁也有缺点,至少有些错误在编译时总是默不吭声。
不过我们有try和except……

 

在数据格式转换方面,struct模块可以满足大部分需求
主要有下面4个方法:
struct.pack
struct.unpack
struct.pack_into
struct.unpack_from

 

还有一个:
struct.calcsize

 

简单记录下!

 

 

struct.pack(fmt, v1, v2, …)
用于将Python的值根据格式符,转换为字符串
参数fmt是格式字符串
v1, v2, …表示要转换的python值
程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import struct 
 
a = 20   
b = 400   
 
str = struct.pack("ii", a, b) 
print 'length:', len(str)   
print str   
print repr(str)   
 
#---- result   
#length: 8   
#      ----这里是乱码   
#'\x14\x00\x00\x00\x90\x01\x00\x00'

 

 

struct.unpack(fmt, string)
刚好与struct.pack相反,用于将字节流转换成python数据类型
注意!返回一个远组
程序代码

1
2
3
4
5
6
7
str = struct.pack("ii", 20, 400)
a1, a2 = struct.unpack("ii", str)
print 'a1:', a1
print 'a2:', a2
#---- result:
#a1: 20
#a2: 400

 

 

struct.pack_into, struct.unpack_from
其实是实现了独个单位的转换
程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import struct   
from ctypes import create_string_buffer   
 
buf = create_string_buffer(12)   
print repr(buf.raw)   
 
struct.pack_into("iii", buf, 0, 1, 2, -1)   
print repr(buf.raw)   
 
print struct.unpack_from('iii', buf, 0)
#我试过用   print struct.unpack_from('iii', buf.raw, 0)   
#居然也能正常使用,很奇怪
#可能就是raw和buf其实都是继承了列表
 
#---- result   
#'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'   
#'\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff'   
#(1, 2, -1)

 

而struct.calcsize用于计算格式字符串所对应的结果的长度
如:struct.calcsize(‘ii’),返回8。
因为两个int类型所占用的长度是8个字节。

 

附录:
格式符 C语言类型 Python类型
x pad byte no value
c char string of length 1
b signed char integer
B unsigned char integer
? _Bool bool
h short integer
H unsigned short integer
i int integer
I unsigned int integer or long
l long integer
L unsigned long long
q long long long
Q unsigned long long long
f float float
d double float
s char[] string
p char[] string
P void * long