pythonstruct.pack ⽤法(转)
格式符”i”表⽰转换为int,’ii’表⽰有两个int变量。
进⾏转换后的结果长度为8个字节(int类型占⽤4个字节,两个int为8个字节) 可以看到输出的结果是乱码,因为结果是⼆进制数据,所以显⽰为乱码。
关于收获的作文可以使⽤python的内置函数repr来获取可识别的字符串,其中⼗六进制的0x00000014, 0x00001009分别表⽰20和400。2、 struct.unpack
struct.unpack做的⼯作刚好与struct.pack相反,⽤于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt,string),该函数返回⼀个元组。 下⾯是⼀个简单的例⼦:1、 struct.pack
平凡的
struct.pack⽤于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这⾥的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串,关于格式字符串的相关信息在下⾯有所介绍。v1, v2,…表⽰要转换的python值。下⾯的例⼦将两个整数转换为字符串(字节流):#!/usr/bin/env python #encoding: utf8 import sys reload(sys)
sys.tdefaultencoding("utf-8") import struct a = 20 b = 400
str = struct.pack("ii", a, b)
print 'length: ', len(str) # length: 8 print str # 乱码:
print repr(str) # '\x14\x00\x00\x00\x90\x01\x00\x00'
123456789101112131415
[python] view plain copy #!/usr/bin/env python #encoding: utf8 import sys reload(sys)
sys.tdefaultencoding("utf-8") import struct a = 20 b = 400 # pack
str = struct.pack("ii", a, b)
print 'length: ', len(str) # length: 8 print str # 乱码:
print repr(str) # '\x14\x00\x00\x00\x90\x01\x00\x00' # unpack
str2 = struct.unpack("ii", str)
超长待机智能print 'length: ', len(str2) # length: 2 print str2 # (20, 400) print repr(str2) # (20, 400)
123456789101112131415161718192021222324
3、 struct.calcsize
降糖小妙招struct.calcsize⽤于计算格式字符串所对应的结果的长度,如:struct.calcsize(‘ii’),返回8。因为两个int类型所占⽤的长度是8个字节。4、 struct.pack_into、 struct.unpack_from
这两个函数在Python⼿册中有所介绍,但没有给出如何使⽤的例⼦。其实它们在实际应⽤中⽤的并不多。Google了很久,才找到⼀个例⼦,贴出来共享⼀下:struct 类型表
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)
[python] view plain copy import struct
print "len: ", struct.calcsize('i') # len: 4 print "len: ", struct.calcsize('ii') # len: 8 print "len: ", struct.calcsize('f') # len: 4 print "len: ", struct.calcsize('ff') # len: 8 print "len: ", struct.calcsize('s') # len: 1 print "len: ", struct.calcsize('ss') # len: 2 print "len: ", struct.calcsize('d') # len: 8 print "len: ", struct.calcsize('dd') # len: 16
12345678910
[python] view plain copy #!/usr/bin/env python #encoding: utf8 import sys reload(sys)
sys.tdefaultencoding("utf-8") import struct
棋鬼
from ctypes import create_string_buffer buf = create_string_buffer(12)
闭塞眼睛捉麻雀
print repr(buf.raw) # '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' struct.pack_into("iii", buf, 0, 1, 2, -1)
print repr(buf.raw) # '\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff' print struct.unpack_from("iii", buf, 0) # (1, 2, -1) 具体内容请参考Python ⼿册 struct 模块
Python ⼿册 struct 模块:docs.python/library/struct.html #module-struct
1234567891011121314151617181920
I unsigned int integer4(3) Format C Type Python type Standard size Notes l long integer4(3)
L unsigned long integer4(3)
q long long integer8(2), (3)
Q unsigned long long integer8(2), (3)
f float float4(4)
d doubl
e float8(4)
s char[]string1
p char[]string
P void *integer(5), (3)