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模块相关推荐

  1. 介绍Python中的__future__模块

    这篇文章主要介绍了介绍Python中的__future__模块,__future__模块使得在Python2.x的版本下能够兼容更多的Python3.x的特性,需要的朋友可以参考下 Python的每个 ...

  2. python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

  3. python使用教程cmd啥意思-Python 中的cmd模块学习

    Python中的cmd模块类型提供了一个创建命令行解析器的框架.简单的来说,可以继承Cmd来创建命令行界面,然后对所有想处理的命令command执行do_command方法.默认情况下,它使用read ...

  4. python中的绘图模块turtle的使用

    python中的绘图模块turtle的使用(7-20190125) 文章目录: 还是从一个有趣的小应用开始,turtle的骚操作吧 最近小猪配齐比较流行,下面用turtle绘制一个粉红色的小猪猪吧-- ...

  5. linux系统python截图不显示中文_Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题...

    本文主要向大家介绍了Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题,通过具体的内容向大家展现,希望对大家学习Linux运维知 ...

  6. Python中的random模块

    Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍.如下: random.random() 用于生成一个0到1的随机浮点数.如: import random r ...

  7. python中的log模块笔记

    日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日志输出中添 ...

  8. python中的系统模块_python中一些获取系统信息的模块

    1.platform模块 python中,platform模块给我们提供了很多方法去获取操作系统的信息 如: import platform platform.platform() #获取操作系统名称 ...

  9. 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue ...

最新文章

  1. JStorm与Storm源码分析(七)--BasicBoltExecutor与装饰模式
  2. 思科虚拟化与视频技术打造协作新体验
  3. python 3.6 tensorflow_无法在python 3.6中导入Tensorflow
  4. Kubernetes—StatefulSet部署有状态应用详解(二十四)
  5. 单调栈解决维持相对位置不变最小/最大字典序问题
  6. C++类继承 函数调用顺序
  7. ORACLE 中NUMBER类型默认的精度和Scale问题
  8. 古文(诗词文)—— 结构模式与复用
  9. 运动世界校园3.0版本逆向分析破解
  10. 【Android测试】在AndroidStudio中进行单元测试
  11. biosrecovery什么意思_BIOS Recovery 简介
  12. Less 颜色操作函数Mix的计算方法
  13. python读取gif图片并显示_Python爬虫实现获取动态gif格式搞笑图片的方法示例
  14. 鼠标作为画笔 | 八
  15. 微信公众号消息模板发送
  16. 前沿|十位顶级大咖为您把脉容器技术大势
  17. 计算机中录音机的使用方法,教你win10系统电脑录音机功能录音的使用教程
  18. CSP202109-4 收集卡牌
  19. Maltego 学习与使用
  20. JAVA微信小程序在线教育视频学习小程序系统毕业设计 开题报告

热门文章

  1. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
  2. 【Git】error: RPC
  3. 做个犀利的码农:如何持续培养/更新自己的开发技能
  4. Linux系统基本操作(二)—设置本地光盘为yum源
  5. js休眠实现sleep[博]
  6. git提示(拷贝密钥问题)“Load key /home/devid/.ssh/id_rsa: bad permissions”
  7. 学习笔记_vnpy实战培训day03
  8. flex4.5新特征
  9. java log4j 相对路径_log4j中配置日志文件相对路径[续集]
  10. 东风科技php,东风科技(600081)违规记录_新浪财经_新浪网