转自:http://blog.csdn.net/JGood/archive/2009/06/22/4290158.aspx
Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8种),它只定义了六种基本 类型:字符串,整数,浮点数,元组,列表,字典。通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时 候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题。打个比方:C++写的客户端发送一个int型(4字节)变量的数据到 Python写的服务器,Python接收到表示这个整数的4个字节数据,怎么解析成Python认识的整数呢? Python的标准模块struct就用来解决这个问题。
struct.pack
- import struct
- a = 20
- b = 400
- str = struct.pack("ii", a, b) #转换后的str虽然是字符串类型,但相当于其他语言中的字节流(字节数组),可以在网络上传输
- print 'length:', len(str)
- print str
- print repr(str)
- #---- result
- #length: 8
- # ----这里是乱码
- #'\x14\x00\x00\x00\x90\x01\x00\x00'
struct.unpack
- str = struct.pack("ii", 20, 400)
- a1, a2 = struct.unpack("ii", str)
- print 'a1:', a1
- print 'a2:', a2
- #---- result:
- #a1: 20
- #a2: 400
struct.calcsize
struct.pack_into, struct.unpack_from
- 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)
关于格式字符串
格式符 | 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 |