python unpack_Python:struct模块的pack、unpack

mport struct

pack、unpack、pack_into、unpack_from

1 # ref: http://blog.csdn.NET/JGood/archive/2009/06/22/4290158.aspx

2

3 import struct

4

5 #pack - unpack

6 print

7 print '===== pack - unpack ====='

8

9 str = struct.pack("ii", 20, 400)

10 print 'str:', str

11 print 'len(str):', len(str) # len(str): 8

12

13 a1, a2 = struct.unpack("ii", str)

14 print "a1:", a1 # a1: 20

15 print "a2:", a2 # a2: 400

16

17 print 'struct.calcsize:', struct.calcsize("ii") # struct.calcsize: 8

18

19

20 #unpack

21 print

22 print '===== unpack ====='

23

24 string = 'test astring'

25 format = '5s 4x 3s'

26 print struct.unpack(format, string) # ('test ', 'ing')

27

28 string = 'he is not very happy'

29 format = '2s 1x 2s 5x 4s 1x 5s'

30 print struct.unpack(format, string) # ('he', 'is', 'very', 'happy')

31

32

33 #pack

34 print

35 print '===== pack ====='

36

37 a = 20

38 b = 400

39

40 str = struct.pack("ii", a, b)

41 print 'length:', len(str) #length: 8

42 print str

43 print repr(str) # '/x14/x00/x00/x00/x90/x01/x00/x00'

44

45

46 #pack_into - unpack_from

47 print

48 print '===== pack_into - unpack_from ====='

49 from ctypes import create_string_buffer

50

51 buf = create_string_buffer(12)

52 print repr(buf.raw)

53

54 struct.pack_into("iii", buf, 0, 1, 2, -1)

55 print repr(buf.raw)

56

57 print struct.unpack_from("iii", buf, 0)

运行结果:

[work@db-testing-com06-vm3.db01.baidu.com Python]$ python struct_pack.py

===== pack - unpack =====

str: ?

len(str): 8

a1: 20

a2: 400

struct.calcsize: 8

===== unpack =====

('test ', 'ing')

('he', 'is', 'very', 'happy')

===== pack =====

length: 8

?

'/x14/x00/x00/x00/x90/x01/x00/x00'

===== pack_into - unpack_from =====

'/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#中,光整型就定义了8种)

它只定义了六种基本类型:字符串,整数,浮点数,元组(set),列表(array),字典(key/value)

通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题。打个比方:C++写的客户端发送一个int型(4字节)变量的数据到Python写的服务器,Python接收到表示这个整数的4个字节数据,怎么解析成Python认识的整数呢? Python的标准模块struct就用来解决这个问题。

struct模块的内容不多,也不是太难,下面对其中最常用的方法进行介绍:

1、 struct.pack

struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, ...),参数fmt是格式字符串,关于格式字符串的相关信息在下面有所介绍。v1, v2, ...表示要转换的python值。

2、 struct.unpack

struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。

下面的例子将两个整数转换为字符串(字节流):

import structa= 20b= 400s= struct.pack('ii', a, b)

print(s, type(s))

#输出:b'\x14\x00\x00\x00\x90\x01\x00\x00' print('length:', len(s))

#输出:length:8s2= struct.unpack('ii', s)

print(s2)

#输出:(20, 400)

s2= struct.unpack('ii', s)

#报错:unpack requires a buffer of4bytes

#==>解压需要一个4字节的缓冲区,也就是说'ii'表示8个字节的缓冲

#格式符"i"表示转换为int,'ii'表示有两个int变量。

#进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节)

可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的0x00000014, 0x00001009分别表示20和400。

3、 struct.calcsize

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

1 import struct

2 print "len: ", struct.calcsize('i') # len: 4

3 print "len: ", struct.calcsize('ii') # len: 8

4 print "len: ", struct.calcsize('f') # len: 4

5 print "len: ", struct.calcsize('ff') # len: 8

6 print "len: ", struct.calcsize('s') # len: 1

7 print "len: ", struct.calcsize('ss') # len: 2

8 print "len: ", struct.calcsize('d') # len: 8

9 print "len: ", struct.calcsize('dd') # len: 16

4、 struct.pack_into、 struct.unpack_from

这两个函数在Python手册中有所介绍,但没有给出如何使用的例子。其实它们在实际应用中用的并不多。Google了很久,才找到一个例子,贴出来共享一下:

1 #!/usr/bin/env python

2 #encoding: utf8

3

4 import sys

5 reload(sys)

6 sys.setdefaultencoding("utf-8")

7

8 import struct

9 from ctypes import create_string_buffer

10

11 buf = create_string_buffer(12)

12 print repr(buf.raw) # '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

13

14 struct.pack_into("iii", buf, 0, 1, 2, -1)

15 print repr(buf.raw) # '\x01\x00\x00\x00\x02\x00\x00\x00\xff\xff\xff\xff'

16

17 print struct.unpack_from("iii", buf, 0) # (1, 2, -1)

struct 类型表

FormatC TypePython typeStandard sizeNotes

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)

I

unsigned int

integer

4

(3)

l

long

integer

4

(3)

L

unsigned long

integer

4

(3)

q

long long

integer

8

(2), (3)

Q

unsigned long long

integer

8

(2), (3)

f

float

float

4

(4)

d

double

float

8

(4)

s

char[]

string

1

p

char[]

string

P

void *

integer

(5), (3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值