python struct模块_python struct 模块
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 模块相关推荐
- python dcf估值_Python 常用模块
本节内容 模块介绍 os 模块 sys 模块 time & datetime模块 random 模块 json & picle shutil 模块 shelve 模块 xml 模块 c ...
- python贪婪匹配_python re模块匹配贪婪和非贪婪模式详解
python re模块匹配贪婪和非贪婪模式详解 这篇文章主要介绍了python re模块匹配贪婪和非贪婪模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友 ...
- python argparse模块_Python argparse模块应用实例解析
这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...
- python莫比乌斯环_python基础|模块
1 模块简介 在python中常见的模块有三种,在python解释器中的内置模块,第三方模块和自定义模块.模块的有使用python编写的文件,有已被编译为共享库或DLL的C或C++扩展,也有使用C编写 ...
- python如何自定义模块_python自定义模块和开源模块使用方法
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- python import变量_Python import模块调用
开发过程中代码越写越多,在一个文件里代码会越来越长,不容易维护,为了容易维护代码,我们把很多函数分组,分别放在不同的文件里,在Python中,一个.py文件就是模块(Module) 工具/原料 Pyt ...
- python shelve模块_python常用模块之shelve模块
python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...
- python常用运维模块_python常用模块之一
sys模块: sys模块是提供关于python本身的详细内在的信息的模块. sys.executable变量,它包含python解释器的路径 sys.platform变量,告诉我们现在处于什么操作系统 ...
- python 多层包多模块_python Modules模块操作
今天学习python的Modules模块操作,并记录学习过程欢迎大家一起交流分享. 首先新建一个python文件命名为my_module.py的自定义moudle文件,在这个文件中进行模块代码编写: ...
- python counter模块_python collections模块 计数器(counter)
一.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 把我写入的元素出现的多少次都计算出来 import collectio ...
最新文章
- 于明:必应发力海外业务 中国搜索营销市场暗流涌动
- 利用Java自带的MD5加密java.security.MessageDigest;
- 在Golang开发中使用Redis
- 主机ping不通Virtualbox里的虚拟机
- 架构专家梁勇:哈啰在分布式消息治理和微服务治理中的实践
- 蜡染印花的跟踪印花与二次整纬
- C++之List保存类内存问题
- SQL Server 2005 分页SQL
- licens 问题 Error (292028): Specified license is not valid for this machine
- [Python]正相匹配中文分词【哈工大 车万翔老师视频公开课】
- 正弦交流电的瞬时值、最大值、有效值
- Python绘制云图
- Java深入(面试常见题)
- tableView的懒懒的跳转方式,加载数据源方式
- 白盒测试---讲解(1)
- 重来之大学版|卸负篇-对自己大学很失望怎么办?觉得自己大学很不好怎么办?刚到大学不适应怎么办?
- XSS(Cross-site Script,跨站脚本)漏洞笔记
- 潜渊症设置语言后闪退bug解决
- 基于USB总线的无线网卡驱动程序
- 基于OSGi的Virgo Server最简单Spring web实例