python中struct模块
时间:2010-06-10 来源:hkebao
python中struct模块
时间:2010-6-10
Python提供的数据类型只包含六种:字符串、整数、浮点数、元组、列表、字典
现在问题来了?
当我用python 与C++进行交互的时候。比如说我用C++传输过来一个int(4字节)到python的socket服务器。那python是如何认识它呢?即如何解决这种跨平台调用的情况!
解决方案:使用struct模块进行解决!
struct.pack
这个家伙的作用:将python的值根据格式符转换为字符串。(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)其实字符串在JAVA里面是可以与字符数组相互转换的。String a=char[]
struct.pack(fmt, v1, v2, ...),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, ...表示要转换的python值。
说明:依据这个格式化字符fmt转换成字符串。
示例:
#-*- coding:utf-8 -*-
import struct
a = 20
b = 400
str = struct.pack("ii",a,b) #依据这种指定的格式进行打包转换
print "length is ",len(str) #这个其实就是一个字符串
print str
print repr(str)
输出:
#---- result
#length: 8
# ----这里是乱码
#'\x14\x00\x00\x00\x90\x01\x00\x00'
格式符"i"表示转换为int,'ii'表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以 看到输出的结果是乱码,因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的 0x00000014, 0x00001009分别表示20和400。
将其按照指定的格式进行打包这样就成为一个二进制数据了。要查看二进制数据的话可以用repr来处理!
struct.unpack
刚好与上面的打包过程相反。把二进制拆包成字符串!
a1, a2 = struct.unpack("ii", str) 按照打包的格式再进行一次拆包处理!
print a1
struct.calcsize
struct.calcsize用于计算格式字符串所对应的结果的长度,如:struct.calcsize('ii'),返回8。因为两个int类型所占用的长度是8个字节。
PS:这个东西的作用应该是返回这个格式化的长度了!
struct.pack_into, struct.unpack_from
这两个函数在Python手册中有所介绍,但没有给出如何使用的例子。其实它们在实际应用中用的并不多。Google了很久,才找到一个例子,贴出来共享一下:
1. import struct
2. from ctypes import create_string_buffer
3.
4. buf = create_string_buffer(12)
5. print repr(buf.raw)
6.
7. struct.pack_into("iii", buf, 0, 1, 2, -1)
8. print repr(buf.raw)
9.
10. print struct.unpack_from('iii', buf, 0)
11.
12. #---- result
13. #'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
14. #'\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff'
15. #(1, 2, -1) 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) #---- 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)
关于格式字符串
在Python手册中,给出了C语言中常用类型与Python类型对应的格式符:
格式符 |
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 |
|
结论:这个模块在不同平台之间进行交互数据的时候非常重要了。可以指定格式化标准进行转换数据。然后再进行交换!