Python3学习笔记之-常用内建模块(struct)


目录

Python3学习笔记之-常用内建模块(struct)

前言

一、常用函数

1、pack()

2、unpack()

二、其他函数

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

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

3、struct.iter_unpack(format, buffer)

三、字节顺序,大小,对齐方式

格式字符


前言

此模块用来处理存储在文件中或是从网络连接等其他来源获取的二进制数据。

一、常用函数

1、pack()

struct.pack(formatv1v2...)

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

structpack函数把任意数据类型变成bytes

>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'

2、unpack()

struct.unpack(formatbuffer)

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

struct.calcsize(format)

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

>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)

二、其他函数

1、struct.pack_into(formatbufferoffsetv1v2...)

根据格式字符串 format 打包 v1v2, ... 等值并将打包的字节串写入可写缓冲区 buffer 从 offset 开始的位置。 请注意 offset 是必需的参数。

2、struct.unpack_from(formatbufferoffset=0)

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

3、struct.iter_unpack(formatbuffer)

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

三、字节顺序,大小,对齐方式

格式字符串的第一个字符可用于指示打包数据的字节顺序,大小和对齐方式

字符

字节顺序

大小

对齐方式

@

按原字节

按原字节

按原字节

=

按原字节

标准

<

小端

标准

>

大端

标准

!

网络(=大端)

标准

格式字符

格式

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)

在 3.3 版更改: 增加了对 'n' 和 'N' 格式的支持

在 3.6 版更改: 添加了对 'e' 格式的支持。

注释:

  1. '?' 转换码对应于 C99 定义的 _Bool 类型。 如果此类型不可用,则使用 char 来模拟。 在标准模式下,它总是以一个字节表示。
  2. 当尝试使用任何整数转换码打包一个非整数时,如果该非整数具有 __index__() 方法,则会在打包之前调用该方法将参数转换为一个整数。
    在 3.2 版更改: 为非整数使用 __index__() 方法是 3.2 版的新增特性。
  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-05 和 6.5e+04 之间的数字。 此类型并不被 C 编译器广泛支持:在一台典型的机器上,可以使用 unsigned short 进行存储,但不会被用于数学运算。