struct库

作者:Erina
6 分钟阅读 871 字

归档

Python

目录

  1. Python struct库
    1. 主要功能
    2. 大端、小端
      1. 大端Big-endian
      2. 小端Little-endian
      3. 应用场景
    3. 常用函数
      1. 1. struct.pack(fmt, v1, v2, ...)
      2. 2. struct.unpack(fmt, string)
      3. 3. struct.calcsize(fmt)
    4. 格式字符
    5. 字节顺序
    6. 示例应用
      1. 处理不同字节序

Python struct库

struct 模块提供了在 Python 值和 C 结构体之间转换的二进制数据的打包和解包功能。它主要用于处理二进制数据文件、网络协议等场景。 struct是python的内置模块,无需额外下载

主要功能

struct模块主要提供以下功能:

大端、小端

给不了解的朋友介绍一下大端和小端

大端Big-endian和小端Little-endian是我们计算机存储多字节数据时采用的不同方式,它们描述了数据在内存中的排列顺序,也就是从左到右或从右到左的顺序。
有趣的是,大端小端的术语其实来自于《格列佛游记》中两个派别关于应该从哪一端打破鸡蛋的争论。

大端Big-endian

小端Little-endian

例如:

>>> struct.pack('<I', 900).hex() # 小端
'84030000'
>>> struct.pack('>I', 900).hex() # 大端
'00000384'

应用场景

1.硬件架构

2.文件格式

常用函数

1. struct.pack(fmt, v1, v2, ...)

将值按照指定的格式(fmt)打包成二进制数据。

>>> struct.pack('if', 42, 3.14)
b'*\x00\x00\x00\xc3\xf5H@'
>>> struct.pack('>i', 900)
b'\x00\x00\x03\x84'
>>> struct.pack('>i', 900).hex()
'00000384'

2. struct.unpack(fmt, string)

将二进制数据按照指定的格式(fmt)解包为Python值。

>>> struct.unpack('if', b'*\x00\x00\x00\xc3\xf5H@')
(42, 3.140000104904175)
>>> struct.unpack('>i', b'\x00\x00\x03\x84')
(900,)

3. struct.calcsize(fmt)

计算按照给定格式打包后的二进制数据大小(字节数)。

>>> struct.calcsize('if')
8
>>> struct.calcsize('i')
4
>>> struct.calcsize('iI')
8

格式字符

格式字符用于指定数据类型和大小:

字符C类型Python类型大小(字节)
cchar长度为1的字符串1
bsigned char整数1
Bunsigned char整数1
hshort整数2
Hunsigned short整数2
iint整数4
Iunsigned int整数4
llong整数4
Lunsigned long整数4
qlong long整数8
Qunsigned long long整数8
ffloat浮点数4
ddouble浮点数8
schar[]字节串
pchar[]字节串
Pvoid*整数

字节顺序

格式字符串的第一个字符可以用来指定字节顺序:

字符字节顺序对齐方式
@本机本机
=本机标准
<小端标准
>大端标准
!网络(大端)标准

示例应用

处理不同字节序

>>> value = 0x12345678 # 创建一个32位整数 0x12345678
>>>
>>> struct.pack('<I', value).hex() # 小端
'78563412'
>>> struct.pack('>I', value).hex() # 大端
'12345678'
>>> struct.pack('@I', value).hex() # 输出取决于系统架构
'78563412'

:::tip[注意事项]

  1. 对齐问题:默认情况下,struct模块会按照C编译器的对齐规则来打包数据。如果需要精确控制字节位置,可以使用标准大小(如<>!前缀)。

  2. 字符串处理:使用s格式字符时,需要指定固定长度,如10s表示10字节的字符串。 :::

struct模块是Python中处理二进制数据的强大工具,特别适合需要与C语言结构体交互、处理二进制文件格式或实现网络协议的场景。通过合理使用格式字符和字节顺序控制,可以高效地在Python值和二进制数据之间进行转换。