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)

python unpack_Python:struct模块的pack、unpack相关推荐

  1. python3 struct模块 处理二进制 pack unpack用法

    python有时需要处理二进制数据,例如 存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用struct来处理c语言中的结构体. struct模块中最重要的三个 ...

  2. 用python将照片做成数据集_python实战项目,struct模块的使用,将MNIST数据集转换为bmp图片...

    最近学习 tensroflow,用到了入门级的经典数据集 MNIST,MNIST 包含几万张 28x28 像素大小的手写数字.但是它的存储是以字节流的形式存储的,几万张图片存储在一个文件里.一直对其很 ...

  3. python struct 模块

    Python没有提供直接的将用户定义的数据类型和文件IO关联起来的功能,但是它提供了struct库(是一个内置库)--我们可以以二进制模式来写这些数据(有趣的是,它真的是设计来讲文本数据写为缓存的) ...

  4. Python使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  5. Python使用struct处理二进制(转)

    转自:https://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 有的时候需要用python处理二进制数据,比如,存取文件,socket操 ...

  6. python通达信模块_Python读取通达信数据

    Python读取通达信数据 一.介绍 python获取股票数据的方法很多,其中Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便. 日线数据存在这路径下 D:\通 ...

  7. python unpack_python中struct.pack()函数和struct.unpack()函数

    python中的struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~.一般输入的渠道来源于文件或者网络的二 ...

  8. python的功能模块_Python的功能模块[1] - struct - struct 在网络编程中的使用

    struct模块/ struct Module 在网络编程中,利用 socket 进行通信时,常常会用到 struct 模块,在网络通信中,大多数传递的数据以二进制流(binary data)存在.传 ...

  9. python中struct_Python的Struct模块,用法以及个人理解

    简介 python strtuct模块主要在Python中的值于C语言结构之间的转换.可用于处理存储在文件或网络连接(或其它来源)中的二进制数据. 顺序.格式字符 现在先不要看图表,稍后我们回来看.图 ...

  10. python struct模块的使用

    struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_in ...

最新文章

  1. 开源监控软件-Nagios-Rhel5.9安装手册
  2. html 边框循环变色,方框用过渡走一圈变色用css怎么实现
  3. 成功解决preprocessing\label.py:151: DeprecationWarning: The truth value of an empty array is ambiguous.
  4. mysql游标的概述_MySQL游标简介
  5. aix Mysql-Rpm puppet puppetAgent
  6. latex中正文前出现一页空白页,且占正文页数
  7. Python验证码识别初探(tesserocr库)
  8. 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图
  9. makeinfo:未找到命令
  10. 如何使用@PostConstruct初始化敏感词库和hutool过滤敏感词信息
  11. 数控直流电压源的设计与制作【keil5 AD20]
  12. 网页抓取工具之数据预处理
  13. 89C51使用ADC0808模数转换
  14. Linux media子系统
  15. JumpServer 堡垒机安装踩坑
  16. 2020年GitHub上50个最受程序员欢迎的PHP开源项目
  17. android实现异网双卡双待识别运营商网络
  18. AI在零售业的五大应用场景:消费者喜欢苹果时,不要给他一箱梨
  19. Adobe国际认证证书是个什么东东,有什么用啊?
  20. java ncso发送电邮_如何在Windows中从命令行发送电子邮件(无需额外的软件)

热门文章

  1. 程序员最常用的6大技术博客排行榜
  2. kafka中的消息(topic)和日志(log)
  3. 魔窗--H5网页唤醒APP
  4. 计算机桌面出现输入框,Mac电脑使用:桌面底部莫名出现白色输入框解决的解决办法...
  5. win10msdn我告诉你哪个版本好
  6. 这行情我还老是管不住手,少kui点就偷着笑吧
  7. mysql通过Navcat 备份数据.psc 还原数据时 只有表没有数据解决方法
  8. google关键词匹配和扩展工具
  9. 中图分类号计算机 tp,中图分类号(TP)
  10. 图片中隐藏信息——图片隐写术