struct模块用于二进制和结构体之间的互相转化,此模块中大部分函数接受一个实现了Buffer协议的对象,最常见的实现了Buffer协议的对象包括bytes、bytearray等,大多数像byte数组这样的对象都实现了Buffer协议。

struct模块的函数

struct模块的函数很少,只有6个。

struct.pack(format, v1, v2, ...):将多个value如v1、v2按照format进行格式化

struct.pack_into(format, buffer, offset, v1, v2, ...):将多个value如v1、v2按照format格式化到buffer的offset处

struct.unpack(format, buffer):从buffer中按照format解析对象

struct.unpack_from(format, buffer, offset=0):从buffer的某个offset处解析对象

struct.iter_unpack(format, buffer):以迭代的形式从buffer中解析对象

struct.calcsize(format):返回format所指定的数据类型的字节数

从以上函数看出,struct模块中格式化字符串format非常重要,format包括两部分:控制部分、类型部分。

以Struct的形式调用struct包的能

struct包提供了Struct类,这个类的构造函数接受一个format串,从而可以使用对象的函数了,可以避免传format参数。

msgpack中的Packer和Unpacker也是类似的作用。

举例

demo1:将int转换为bytes

buf1 = 256

bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'

ret1 = struct.unpack('i', bin_buf1)

print(bin_buf1, ' <====> ', ret1)

这段程序将256这个数字通过pack函数转化成了bytes类型,其中pack的第一个参数i表示buf1为int类型的数据。

demo2:将浮点数转化为bytes

buf2 = 3.1415

bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'

ret2 = struct.unpack('d', bin_buf2)

print(bin_buf2, ' <====> ', ret2)

demo3:将字符串转换为bytes

# 字符串 -> 二进制流

buf3 = 'Hello World'

bin_buf3 = struct.pack('11s', bytes(buf3,encoding='ascii')) # '11s'代表长度为11的'string'字符数组

ret3 = struct.unpack('11s', bin_buf3)

print(bin_buf3, ' <====> ', ret3)

这里的11s表示buf3为长度11个字符的数组。同理,也可以使用“11i”表示11个int类型的数据,还可以使用“iiiiiiiiiii”表示11i

demo4:将结构体转化为bytes

# 结构体 -> 二进制流

# 假设有一个结构体

# struct header {

# int buf1;

# double buf2;

# char buf3[11];

# }

bin_buf_all = struct.pack('id11s', buf1, buf2, bytes(buf3,encoding='ascii'))

ret_all = struct.unpack('id11s', bin_buf_all)

print(bin_buf_all, ' <====> ', ret_all)

demo5:常用方法

# 按照给定的格式化字符串,把数据封装成字符串(实际上是类似于c结构体的字节流)

string = struct.pack(fmt, v1, v2, ...)

# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple

tuple = unpack(fmt, string)

# 计算给定的格式(fmt)占用多少字节的内存

offset = calcsize(fmt)

手册

格式化字符串的存储部分

从表中可以发现如下规律:

整数类型b、h、i、q分别表示1个字节、2个字节、4个字节、8个字节,对应的大写字母表示无符号整数

f、d表示float和double

c表示字符、s表示字符串,需要注意:struct模块并不能直接将str类型转为bytes,当format为c和s时,对象需要是byte类型或者bytes类型

FormatC TypePython字节数

x

pad byte

no value

1

c

char

string of length 1

1

b

signed char

integer

1

B

unsigned char

integer

1

?

_Bool

bool

1

h

short

integer

2

H

unsigned short

integer

2

i

int

integer

4

I

unsigned int

integer or lon

4

l

long

integer

4

L

unsigned long

long

4

q

long long

long

8

Q

unsigned long long

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void *

long

格式化字符串的控制部分

@表示默认,一切以本地为主

=表示对象的大小使用标准大小

表示小头序和大头序

!永远不会用到,可以忽略

CharacterByte orderSize and alignment

@

native

native 凑够4个字节

=

native

standard 按原字节数

<

little-endian

standard 按原字节数

>

big-endian

standard 按原字节数

!

network (= big-endian)

standard 按原字节数

#参考资料 [monitor1379](http://www.jianshu.com/p/5a985f29fa81)

python struct模块_python struct 模块相关推荐

  1. python dcf估值_Python 常用模块

    本节内容 模块介绍 os 模块 sys 模块 time & datetime模块 random 模块 json & picle shutil 模块 shelve 模块 xml 模块 c ...

  2. python贪婪匹配_python re模块匹配贪婪和非贪婪模式详解

    python re模块匹配贪婪和非贪婪模式详解 这篇文章主要介绍了python re模块匹配贪婪和非贪婪模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友 ...

  3. python argparse模块_Python argparse模块应用实例解析

    这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...

  4. python莫比乌斯环_python基础|模块

    1 模块简介 在python中常见的模块有三种,在python解释器中的内置模块,第三方模块和自定义模块.模块的有使用python编写的文件,有已被编译为共享库或DLL的C或C++扩展,也有使用C编写 ...

  5. python如何自定义模块_python自定义模块和开源模块使用方法

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  6. python import变量_Python import模块调用

    开发过程中代码越写越多,在一个文件里代码会越来越长,不容易维护,为了容易维护代码,我们把很多函数分组,分别放在不同的文件里,在Python中,一个.py文件就是模块(Module) 工具/原料 Pyt ...

  7. python shelve模块_python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  8. python常用运维模块_python常用模块之一

    sys模块: sys模块是提供关于python本身的详细内在的信息的模块. sys.executable变量,它包含python解释器的路径 sys.platform变量,告诉我们现在处于什么操作系统 ...

  9. python 多层包多模块_python Modules模块操作

    今天学习python的Modules模块操作,并记录学习过程欢迎大家一起交流分享. 首先新建一个python文件命名为my_module.py的自定义moudle文件,在这个文件中进行模块代码编写: ...

  10. python counter模块_python collections模块 计数器(counter)

    一.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 把我写入的元素出现的多少次都计算出来 import collectio ...

最新文章

  1. 于明:必应发力海外业务 中国搜索营销市场暗流涌动
  2. 利用Java自带的MD5加密java.security.MessageDigest;
  3. 在Golang开发中使用Redis
  4. 主机ping不通Virtualbox里的虚拟机
  5. 架构专家梁勇:哈啰在分布式消息治理和微服务治理中的实践
  6. 蜡染印花的跟踪印花与二次整纬
  7. C++之List保存类内存问题
  8. SQL Server 2005 分页SQL
  9. licens 问题 Error (292028): Specified license is not valid for this machine
  10. [Python]正相匹配中文分词【哈工大 车万翔老师视频公开课】
  11. 正弦交流电的瞬时值、最大值、有效值
  12. Python绘制云图
  13. Java深入(面试常见题)
  14. tableView的懒懒的跳转方式,加载数据源方式
  15. 白盒测试---讲解(1)
  16. 重来之大学版|卸负篇-对自己大学很失望怎么办?觉得自己大学很不好怎么办?刚到大学不适应怎么办?
  17. XSS(Cross-site Script,跨站脚本)漏洞笔记
  18. 潜渊症设置语言后闪退bug解决
  19. 基于USB总线的无线网卡驱动程序
  20. 基于OSGi的Virgo Server最简单Spring web实例

热门文章

  1. Topo系统的益处和帮助
  2. javascript获取url参数的代码
  3. 距离向量路由环路解决的方法.
  4. EasyNetQ介绍
  5. Spring在bean配置文件中定义电子邮件模板
  6. 原创jquery插件treeTable(转)
  7. Struts 动态FORM实现过程
  8. PHPStorm配置使用Git
  9. JSON 是什么?它能带来什么?它和 XML 比较?
  10. PHP中的addslashes()