当前位置: 首页 > article >正文

python struct.unpack和struct.pack详解

Python相关文档链接: https://docs.python.org/3/library/struct.html#format-characters

简介

struct模块用于将外部压缩的格式字符串与Python类型值进行转换,用于外部文件,网络数据,或是python与c语言程序间的数据交换。
而struct.unpack则是用于将外部压缩的格式字符串进行解压(一般是对struct.pack函数压缩的数据进行解压),同时返回结果为一个元组,且解压的数据大小必须满足格式指定的字节数。
同样struct.pack则是将输入的值根据对应的格式进行压缩,并返回对应压缩后的二进制串。

函数格式

struct.unpack(format, buffer)
formatbuffer
format描述了解包数据的格式,具体内容见下述format strings进行解包的缓冲区数据
struct.pack(format, v1, v2, ...)
formatv1, v2, …
format描述需要数据的格式,具体内容见下述format strings需要进行压缩的值,需要注意的是这些值必须与format的格式相匹配

Format Strings

format strings的第一个字符为一个特殊字符,用于表示相关的控制信息,若第一个字符并不为指定表中字符,则取默认值,并将第一个字符按format character处理。剩余的字符则对应相应的format character表示具体的数据交换格式。其中每个format character前面都有一个可选数字用于表示该字符匹配的数量。

第一个字符

format里的第一个字符用于表示字节顺序、数据读取的大小表示、对齐方式。
其中各个字符代表的含义如下所示:

字符字节顺序大小表示对齐方式
@本地1本地本地
=本地标准2
<小端标准
>大端标准
!网络(总是大端)标准

需要注意的是,如果第一个字符不是这些字符之一,则默认为@。并将第一个字符按format character处理。

Format Character

format character则是接在第一个字符后用于表示数据转换时对应的数据类型,如字符f则表示将C语言的float类型转换为Python的float类型。同时该字符前可增加一个可选数字用于表示该字符匹配的数量,如4f则表示匹配4个float类型的数据。更多字符表示详见下表。
同时若指定的大小表示类型为标准,则以下表的数据类型大小为准,若指定的大小表示类型为本地,则取本机数据C语言sizeof指定的数据类型大小。

字符C类型Python类型标准大小
x填充字节无对应值[]3
cchar长度为1的bytes1
bsigned charinteger1
Bunsigned charinteger1
?_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger4
llonginteger4
Lunsigned longinteger4
qlong longinteger8
Qunsigned long longinteger8
nssize_tinteger[]4
Nsize_tinteger[]4
e[]5float2
ffloatfloat4
ddoublefloat8
schar[]bytes[]6
pchar[]bytes[]7
Pvoid*integer[]8

样例

导入函数

>>> from struct import *

对相同的数字按short,int,long,long long进行压缩和解压

>>> pack(">hilq", 5, 5, 5, 5)
b'\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05'
>>> unpack(">hilq", b'\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05')
(5, 5, 5, 5)

压缩和解压指定长度的数字

>>> pack(">6h",1 ,2 ,3 ,4 ,5 ,6)
b'\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06'
>>> unpack(">6h", b'\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06')
(1, 2, 3, 4, 5, 6)

采用@按本机4字节进行对齐

pack("@hi", 5, 5)
b'\x05\x00\x00\x00\x05\x00\x00\x00'

进行字符串的压缩和解压

>>> pack("@5s", b'12345')
b'12345'
>>> unpack("@5s5s", b'1234567891')
(b'12345', b'67891')

使用x进行字节填充

>>> pack(">h4x",3)
b'\x00\x03\x00\x00\x00\x00'

  1. 本地的字节顺序取决于你主机系统的字节顺序,如Intel x86, AMD64 (x86-64)和Apple M1用的是小端的字节顺序,IBM z用的大端的字节顺序。本地的大小表示和对齐方式则是C语言sizeof的表示方式。 ↩︎

  2. 标准的大小表示取决于格式字符类型对应的大小,详见Format Character。 ↩︎

  3. 填充字节用于pack时插入一个空字节。 ↩︎

  4. 这两个字符只用于本地的大小表示(即第一个字符为@或取默认值)。 ↩︎ ↩︎

  5. 该字符用于表示由IEEE 754 standard提出的半精度浮点数,其由1bit符号位,5bit指数位,11bit精度位组成。 ↩︎

  6. 该字符的大小表示为字节的总长度,所以我们需要用数字加在字符前用于限定字节的总长度。如10s则表示10字节的字符串。 ↩︎

  7. 该字符表示的为"Pascal字符串"。其第一个字节用于存储该字符串的长度length,在pack函数中使用该字符时,只会压缩后面length-1的字符串,超出部分则截断,短缺部分则用空字节填充。注意因仅有一字节的长度位,该字符串的长度最多为255。 ↩︎

  8. 该字符只用于本地的字节顺序表示(即第一个字符为@或取默认值)。注意该字符并不适用于第一个字符为=,即使它也采用本地的字节顺序表示。 ↩︎

http://www.lryc.cn/news/2414490.html

相关文章:

  • Android更强大的滚动控件RecyclerView(详解)
  • Linux网络编程:libevent事件通知I/O框架
  • 温度传感器---DS18B20
  • url编码之urldecode,urlencode/python自带的http服务/cookie,session,token
  • 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
  • bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO
  • 串口通信原理
  • 使用Windows自带命令diskpart管理分区
  • Openjudge 栈的基本操作
  • 【建议收藏】7 个“最佳”AI 视频生成器
  • innerHTML的作用及用法。
  • JS中的Date类
  • 从头开始认识jboss
  • 什么是ANR,如何避免ANR
  • 【文心快码】Comate安装与使用体验分享
  • zookeeper实战全面讲解(一)
  • 6、ExtJs——Ext基础架构--认识Ext.js和Ext-more.js
  • Java高级编程——多线程
  • MySQL产品(DBMS)学习总结
  • 使用Python抓取并渲染包含JavaScript的网页(PhantomJS)
  • JAVA高频216道面试题+答案!!面试必备
  • 顶刊复现:机器学习解释利器—SHAP实战【免费获取】
  • 【Windows】Windows11查看文件的md5值
  • js 文件下载的代码
  • Mybatis源码解析--Mapper代理对象
  • 【D触发器】从底层重新认识 D 触发器、建立时间和保持时间
  • apple iMac一体机 装双系统 实战! (Apple +Win 7 64bit)Good
  • EJB3.0介绍
  • axure注册码
  • matlab2015的marker,matlab中markersize什么意思