Python-二进制模块struct

目录

简介

字节顺序、大小和对齐方式

函数

struct.pack(format, v1, v2, ...)

struct.pack_into(format, buffer, offset, v1, v2, ...)

struct.calcsize(format)

struct.unpack(format, buffer)

struct.unpack_from(format, buffer, offset=0)

struct.iter_unpack(format, buffer)

格式字符

举例

参考


简介

此模块可以此模块可以执行 Python 值和以 Python bytes对象表示的C结构之间的转换,使用格式字符串作为 C 结构布局的精简描述以及与 Python 值的双向转换

字节顺序、大小和对齐方式

默认情况下,C类型以机器的本机格式和字节顺序表示,并在必要时通过跳过填充字节进行正确对齐,或者,根据下表,格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式:

字符

字节顺序

大小

对齐方式

@

按原字节

按原字节

按原字节

=

按原字节

标准

<

小端

标准

>

大端

标准

!

网络(=大端)

标准

本机字节顺序可能为大端或是小端,取决于主机系统的不同。使用 sys.byteorder 来检查你的系统字节顺序。

>>> import sys
>>> print(sys.byteorder)
little

注意

  • 填充只会在连续结构成员之间自动添加。 填充不会添加到已编码结构的开头和末尾。
  • 当使用非本机大小和对齐方式即 '<', '>', '=', 和'!' 时不会添加任何填充。
  • 要将结构的末尾对齐到符合特定类型的对齐要求,请以该类型代码加重复计数的零作为格式结束。

函数

struct.pack(format, v1, v2, ...)

返回一个 bytes 对象,其中包含根据格式字符串 format 打包的值 v1, v2, ... 参数个数必须与格式字符串所要求的值完全匹配。

struct.pack_into(format, buffer, offset, v1, v2, ...)

根据格式字符串 format 打包 v1, v2, ... 等值并将打包的字节串写入可写缓冲区 bufferoffset 开始的位置。

struct.calcsize(format)

返回与格式字符串 format 相对应的结构的大小(即 pack(format, ...) 所产生的字节串对象的大小)。

struct.unpack(format, buffer)

根据格式字符串 format 从缓冲区 buffer 解包(假定是由 pack(format, ...) 打包)。 结果为一个元组,即使其只包含一个条目。 缓冲区的字节大小必须匹配格式所要求的大小,如calcsize所示。

struct.unpack_from(format, buffer, offset=0)

bufferoffset 开始的位置根据格式字符串 format 进行解包。 结果为一个元组,即使其只包含一个条目。 缓冲区的字节大小减去 offset 必须匹配格式所要求的大小,如calcsize所示。

struct.iter_unpack(format, buffer)

根据格式字符串 format 以迭代方式从缓冲区 buffer 解包。 此函数返回一个迭代器,它将从缓冲区读取相同大小的块直至其内容全部耗尽。 缓冲区的字节大小必须整数倍于格式所要求的大小,如calcsize所示。

每次迭代将产生一个如格式字符串所指定的元组。

format由格式字符组成,请看下面

格式字符

格式

C 类型

Python 类型

标准大小

注释

x

填充字节

  

c

char

长度为 1 的字节串

1

 

b

signed char

整数

1

(1), (2)

B

unsigned char

整数

1

(2)

?

_Bool

bool

1

(1)

h

short

整数

2

(2)

H

unsigned short

整数

2

(2)

i

int

整数

4

(2)

I

unsigned int

整数

4

(2)

l

long

整数

4

(2)

L

unsigned long

 

整数

4

(2)

q

long long

整数

8

(2)

Q

unsigned long long

整数

8

(2)

n

ssize_t

整数

 

(3)

N

size_t

整数

 

(3)

e

(6)

浮点数

2

(4)

f

float

浮点数

4

(4)

d

double

浮点数

8

(4)

s

char[]

字节串

  

p

char[]

字节串

  

P

void *

整数

 

(5)

注释:

  1. '?' 转换码对应于 C99 定义的 _Bool 类型。 如果此类型不可用,则使用 char 来模拟。 在标准模式下,它总是以一个字节表示。

  2. 当尝试使用任何整数转换码打包一个非整数时,如果该非整数具有__index()__方法,则会在打包之前调用该方法将参数转换为一个整数。

  3. 'n''N' 转换码仅对本机大小可用(选择为默认或使用 '@' 字节顺序字符)。 对于标准大小,你可以使用适合你的应用的任何其他整数格式。

  4. 对于 'f', 'd''e' 转换码,打包表示形式将使用 IEEE 754 binary32, binary64 或 binary16 格式 (分别对应于 'f', 'd''e'),无论平台使用何种浮点格式。

  5. 'P' 格式字符仅对本机字节顺序可用(选择为默认或使用 '@' 字节顺序字符)。 字节顺序字符 '=' 选择使用基于主机系统的小端或大端排序。 struct 模块不会将其解读为本机排序,因此 'P' 格式将不可用。

  6. IEEE 754 binary16 "半精度" 类型是在IEEE 754标准的 2008 修订版中引入的。 它包含一个符号位,5 个指数位和 11 个精度位(明确存储 10 位),可以完全精确地表示大致范围在 6.1e-056.5e+04 之间的数字。 此类型并不被 C 编译器广泛支持:在一台典型的机器上,可以使用 unsigned short 进行存储,但不会被用于数学运算。 请参阅维基百科页面 half-precision floating-point format 了解详情。

格式字符之前可以带有整数重复计数。 例如,格式字符串 '4h' 的含义与 'hhhh' 完全相同。

举例

>>> from struct import *
>>> pack('>2Bh',1,2,3)
b'\x01\x02\x00\x03'
>>> calcsize('>2Bh')
4
>>> unpack('>2Bh',b'\x01\x02\x00\x03')
(1, 2, 3)

两个1字节的整数,一个2字节的整数,采用大端模式即数据的高字节保存在内存的低地址中,输出的时候都是默认从低地址向高地址进行的。

参考

Python3.7官方文档标准库-struct

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值