struct --- 打包和解包基本数据类型

本模块使用格式字符串来描述数据的布局,在 Python 值与以 Python bytes 对象表示的 C 风格结构体之间进行转换。

支持以下字节序:

字符

字节序

大小

对齐

@

本机

本机

本机

<

小端

标准

>

大端

标准

!

网络(= 大端)

标准

支持以下数据类型:

格式

C 类型

Python 类型

标准大小

b

signed char

整数

1

B

unsigned char

整数

1

h

short

整数

2

H

unsigned short

整数

2

i

int

整数(1

4

I

unsigned int

整数(1

4

l

long

整数(1

4

L

unsigned long

整数(1

4

q

long long

整数(1

8

Q

unsigned long long

整数(1

8

e

n/a(半精度浮点数)

浮点数(2

2

f

float

浮点数(2

4

d

double

浮点数(2

8

s

char[]

bytes

P

void *

整数

  1. 当用于大于 30 位的值时需要 long 支持。

  2. 需要浮点数支持。

与 CPython 的区别

格式字符串中不支持空白字符。

示例

打包和解包小端值。< 前缀选择小端字节序,并采用标准大小且不进行对齐:

import struct

# Pack an unsigned short (H, 2 bytes) then an unsigned int (I, 4 bytes).
data = struct.pack("<HI", 7, 1000)
# data == b'\x07\x00\xe8\x03\x00\x00'

# Unpack returns a tuple of the values, in order.
struct.unpack("<HI", data)
# (7, 1000)

# calcsize() reports how many bytes the format needs.
struct.calcsize("<HI")
# 6

在指定字节偏移处打包到现有缓冲区并从中解包:

buf = bytearray(8)

# Write a little-endian signed int (i) at offset 2.
struct.pack_into("<i", buf, 2, -12345)
# buf == bytearray(b'\x00\x00\xc7\xcf\xff\xff\x00\x00')

# Read it back from the same offset.
struct.unpack_from("<i", buf, 2)
# (-12345,)

函数

struct.calcsize(fmt: str) int

返回存储给定 fmt 所需的字节数。

struct.pack(fmt: str, *values: Any) bytes

根据格式字符串 fmt 打包 values。返回值是一个对这些值进行编码的 bytes 对象。

struct.pack_into(fmt: str, buffer: Any, offset: int, *values: Any) None

根据格式字符串 fmtvalues 打包到 buffer 中、从 offset 处开始。offset 可以为负,表示从 buffer 的末尾倒数。

struct.unpack(fmt: str, data: bytes) Tuple

根据格式字符串 fmtdata 中解包。返回值是一个由解包出的值组成的元组。

struct.unpack_from(fmt: str, data: bytes, offset: int = 0, /) Tuple

根据格式字符串 fmtdataoffset 处开始解包。offset 可以为负,表示从 data 的末尾倒数。返回值是一个由解包出的值组成的元组。