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类型
Format | C Type | Python | 字节数 |
---|---|---|---|
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 |
格式化字符串的控制部分
@
表示默认,一切以本地为主=
表示对象的大小使用标准大小<
、>
表示小头序和大头序!
永远不会用到,可以忽略
Character | Byte order | Size and alignment |
---|---|---|
@ | native | native 凑够4个字节 |
= | native | standard 按原字节数 |
< | little-endian | standard 按原字节数 |
> | big-endian | standard 按原字节数 |
! | network (= big-endian) | standard 按原字节数 |
参考资料
monitor1379
转载于:https://www.cnblogs.com/weiyinfu/p/7977729.html
python中的struct模块相关推荐
- 介绍Python中的__future__模块
这篇文章主要介绍了介绍Python中的__future__模块,__future__模块使得在Python2.x的版本下能够兼容更多的Python3.x的特性,需要的朋友可以参考下 Python的每个 ...
- python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
- python使用教程cmd啥意思-Python 中的cmd模块学习
Python中的cmd模块类型提供了一个创建命令行解析器的框架.简单的来说,可以继承Cmd来创建命令行界面,然后对所有想处理的命令command执行do_command方法.默认情况下,它使用read ...
- python中的绘图模块turtle的使用
python中的绘图模块turtle的使用(7-20190125) 文章目录: 还是从一个有趣的小应用开始,turtle的骚操作吧 最近小猪配齐比较流行,下面用turtle绘制一个粉红色的小猪猪吧-- ...
- linux系统python截图不显示中文_Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题...
本文主要向大家介绍了Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题,通过具体的内容向大家展现,希望对大家学习Linux运维知 ...
- Python中的random模块
Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍.如下: random.random() 用于生成一个0到1的随机浮点数.如: import random r ...
- python中的log模块笔记
日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日志输出中添 ...
- python中的系统模块_python中一些获取系统信息的模块
1.platform模块 python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获取操作系统名称 ...
- 深入理解python中的select模块
简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...
最新文章
- JStorm与Storm源码分析(七)--BasicBoltExecutor与装饰模式
- 思科虚拟化与视频技术打造协作新体验
- python 3.6 tensorflow_无法在python 3.6中导入Tensorflow
- Kubernetes—StatefulSet部署有状态应用详解(二十四)
- 单调栈解决维持相对位置不变最小/最大字典序问题
- C++类继承 函数调用顺序
- ORACLE 中NUMBER类型默认的精度和Scale问题
- 古文(诗词文)—— 结构模式与复用
- 运动世界校园3.0版本逆向分析破解
- 【Android测试】在AndroidStudio中进行单元测试
- biosrecovery什么意思_BIOS Recovery 简介
- Less 颜色操作函数Mix的计算方法
- python读取gif图片并显示_Python爬虫实现获取动态gif格式搞笑图片的方法示例
- 鼠标作为画笔 | 八
- 微信公众号消息模板发送
- 前沿|十位顶级大咖为您把脉容器技术大势
- 计算机中录音机的使用方法,教你win10系统电脑录音机功能录音的使用教程
- CSP202109-4 收集卡牌
- Maltego 学习与使用
- JAVA微信小程序在线教育视频学习小程序系统毕业设计 开题报告
热门文章
- C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
- 【Git】error: RPC
- 做个犀利的码农:如何持续培养/更新自己的开发技能
- Linux系统基本操作(二)—设置本地光盘为yum源
- js休眠实现sleep[博]
- git提示(拷贝密钥问题)“Load key /home/devid/.ssh/id_rsa: bad permissions”
- 学习笔记_vnpy实战培训day03
- flex4.5新特征
- java log4j 相对路径_log4j中配置日志文件相对路径[续集]
- 东风科技php,东风科技(600081)违规记录_新浪财经_新浪网