struct --- 封裝與解封裝基本資料類型

本模組使用格式字串來描述資料的配置,在 Python 值與以 Python bytes 物件表示的 C 風格結構之間進行轉換。

支援以下位元組順序:

字元

位元組順序

大小

對齊

@

原生

原生

原生

<

小端序(little-endian)

標準

>

大端序(big-endian)

標準

!

網路(= 大端序)

標準

支援以下資料類型:

格式

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 的尾端開始計算。回傳值是一個由解封裝後的值組成的元組。