struct --- Giải thích byte dưới dạng dữ liệu nhị phân được đóng gói

Source code: Lib/struct.py


Mô-đun này chuyển đổi giữa các giá trị Python và cấu trúc C được biểu diễn dưới dạng đối tượng Python bytes. Zz001zz nhỏ gọn mô tả các chuyển đổi dự kiến ​​sang/từ các giá trị Python. Các chức năng và đối tượng của mô-đun có thể được sử dụng cho hai ứng dụng khác nhau, trao đổi dữ liệu với các nguồn bên ngoài (tệp hoặc kết nối mạng) hoặc truyền dữ liệu giữa ứng dụng Python và lớp C.

Ghi chú

Khi không có ký tự tiền tố nào được cung cấp, chế độ gốc là mặc định. Nó đóng gói hoặc giải nén dữ liệu dựa trên nền tảng và trình biên dịch mà trình thông dịch Python được xây dựng trên đó. Kết quả của việc đóng gói một cấu trúc C nhất định bao gồm các byte đệm duy trì sự liên kết thích hợp cho các loại C có liên quan; tương tự, việc căn chỉnh cũng được tính đến khi giải nén. Ngược lại, khi truyền dữ liệu giữa các nguồn bên ngoài, người lập trình chịu trách nhiệm xác định thứ tự byte và phần đệm giữa các phần tử. Xem Thứ tự byte, kích thước và căn chỉnh để biết chi tiết.

Một số hàm struct (và các phương thức của Struct) nhận đối số buffer. Điều này đề cập đến các đối tượng triển khai Giao thức đệm và cung cấp bộ đệm có thể đọc hoặc có thể ghi. Các loại phổ biến nhất được sử dụng cho mục đích đó là bytesbytearray, nhưng nhiều loại khác có thể được xem dưới dạng một mảng byte triển khai giao thức bộ đệm để có thể đọc/điền chúng mà không cần sao chép thêm từ đối tượng bytes.

Chức năng và ngoại lệ

Mô-đun xác định các ngoại lệ và chức năng sau:

exception struct.error

Ngoại lệ được nêu ra trong nhiều dịp khác nhau; đối số là một chuỗi mô tả những gì sai.

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

Trả về một đối tượng byte chứa các giá trị v1, v2, ... được đóng gói theo chuỗi định dạng format. Các đối số phải khớp chính xác với các giá trị mà định dạng yêu cầu.

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

Đóng gói các giá trị v1, v2, ... theo chuỗi định dạng format và ghi các byte đã đóng gói vào bộ đệm có thể ghi buffer bắt đầu từ vị trí offset. Lưu ý rằng offset là đối số bắt buộc.

struct.unpack(format, buffer)

Giải nén khỏi bộ đệm buffer (có lẽ được đóng gói bởi pack(format, ...)) theo chuỗi định dạng format. Kết quả là một bộ ngay cả khi nó chứa đúng một mục. Kích thước của bộ đệm tính bằng byte phải khớp với kích thước mà định dạng yêu cầu, như được phản ánh bởi calcsize().

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

Giải nén từ buffer bắt đầu từ vị trí offset, theo chuỗi định dạng format. Kết quả là một bộ ngay cả khi nó chứa đúng một mục. Kích thước của bộ đệm tính bằng byte, bắt đầu từ vị trí offset, ít nhất phải bằng kích thước mà định dạng yêu cầu, như được phản ánh bởi calcsize().

struct.iter_unpack(format, buffer)

Lặp lại giải nén từ bộ đệm buffer theo chuỗi định dạng format. Hàm này trả về một trình vòng lặp sẽ đọc các đoạn có kích thước bằng nhau từ bộ đệm cho đến khi tất cả nội dung của nó được sử dụng hết. Kích thước của bộ đệm tính bằng byte phải là bội số của kích thước mà định dạng yêu cầu, như được phản ánh bởi calcsize().

Mỗi lần lặp mang lại một bộ dữ liệu được chỉ định bởi chuỗi định dạng.

Added in version 3.4.

struct.calcsize(format)

Trả về kích thước của cấu trúc (và do đó của đối tượng byte được tạo bởi pack(format, ...)) tương ứng với chuỗi định dạng format.

Chuỗi định dạng

Chuỗi định dạng mô tả bố cục dữ liệu khi đóng gói và giải nén dữ liệu. Chúng được xây dựng từ format characters, chỉ định loại dữ liệu được đóng gói/giải nén. Ngoài ra, các ký tự đặc biệt điều khiển byte order, size and alignment. Mỗi chuỗi định dạng bao gồm một ký tự tiền tố tùy chọn mô tả các thuộc tính tổng thể của dữ liệu và một hoặc nhiều ký tự định dạng mô tả các giá trị dữ liệu thực tế và phần đệm.

Thứ tự byte, kích thước và căn chỉnh

Theo mặc định, loại C được thể hiện ở định dạng gốc và thứ tự byte của máy, đồng thời được căn chỉnh chính xác bằng cách bỏ qua các byte đệm nếu cần (theo các quy tắc được trình biên dịch C sử dụng). Hành vi này được chọn sao cho các byte của cấu trúc được đóng gói tương ứng chính xác với bố cục bộ nhớ của cấu trúc C tương ứng. Việc sử dụng thứ tự byte gốc và phần đệm hay định dạng tiêu chuẩn tùy thuộc vào ứng dụng.

Ngoài ra, ký tự đầu tiên của chuỗi định dạng có thể được sử dụng để biểu thị thứ tự byte, kích thước và căn chỉnh của dữ liệu được đóng gói, theo bảng sau:

nhân vật

Thứ tự byte

Kích thước

Căn chỉnh

@

bản xứ

bản xứ

bản xứ

=

bản xứ

tiêu chuẩn

không có

<

endian nhỏ

tiêu chuẩn

không có

>

người lớn tuổi

tiêu chuẩn

không có

!

mạng (= big-endian)

tiêu chuẩn

không có

Nếu ký tự đầu tiên không phải là một trong những ký tự này thì '@' được giả định.

Ghi chú

Số 1023 (0x3ff ở dạng thập lục phân) có các cách biểu diễn byte sau:

  • 03 ff ở dạng lớn (>)

  • ff 03 ở endian nhỏ (<)

Ví dụ về Python:

>>> import struct
>>> struct.pack('>h', 1023)
b'\x03\xff'
>>> struct.pack('<h', 1023)
b'\xff\x03'

Thứ tự byte gốc là big-endian hoặc little-endian, tùy thuộc vào hệ thống máy chủ. Ví dụ: Intel x86, AMD64 (x86-64) và Apple M1 là những sản phẩm endian nhỏ; IBM z và nhiều kiến ​​trúc kế thừa có tính chất lớn. Sử dụng sys.byteorder để kiểm tra độ bền của hệ thống của bạn.

Kích thước gốc và căn chỉnh được xác định bằng cách sử dụng biểu thức sizeof của trình biên dịch C. Điều này luôn được kết hợp với thứ tự byte gốc.

Kích thước tiêu chuẩn chỉ phụ thuộc vào ký tự định dạng; xem bảng trong phần Định dạng ký tự.

Lưu ý sự khác biệt giữa '@''=': cả hai đều sử dụng thứ tự byte gốc, nhưng kích thước và căn chỉnh của cái sau được chuẩn hóa.

Biểu mẫu '!' thể hiện thứ tự byte mạng luôn là thứ tự lớn nhất như được xác định trong IETF RFC 1700.

Không có cách nào để chỉ ra thứ tự byte không gốc (buộc hoán đổi byte); sử dụng lựa chọn thích hợp là '<' hoặc '>'.

Ghi chú:

  1. Phần đệm chỉ được thêm tự động giữa các thành viên cấu trúc kế tiếp nhau. Không có phần đệm nào được thêm vào đầu hoặc cuối cấu trúc được mã hóa.

  2. Không có phần đệm nào được thêm vào khi sử dụng kích thước và căn chỉnh không phải gốc, ví dụ: với '<', '>', '=' và '!'.

  3. Để căn chỉnh phần cuối của cấu trúc theo yêu cầu căn chỉnh của một loại cụ thể, hãy kết thúc định dạng bằng mã cho loại đó với số lần lặp lại bằng 0. Xem Ví dụ.

Định dạng ký tự

Các ký tự định dạng có ý nghĩa như sau; việc chuyển đổi giữa các giá trị C và Python phải rõ ràng với các loại của chúng. Cột 'Kích thước chuẩn' đề cập đến kích thước của giá trị được đóng gói tính bằng byte khi sử dụng kích thước tiêu chuẩn; nghĩa là khi chuỗi định dạng bắt đầu bằng một trong các '<', '>', '!' hoặc '='. Khi sử dụng kích thước gốc, kích thước của giá trị đóng gói phụ thuộc vào nền tảng.

định dạng

Loại C

loại Python

Kích thước tiêu chuẩn

Ghi chú

x

byte đệm

không có giá trị

(7)

c

char

byte có độ dài 1

1

b

signed char

số nguyên

1

(1), (2)

B

unsigned char

số nguyên

1

(2)

?

_Bool

bool

1

(1)

h

short

số nguyên

2

(2)

H

unsigned short

số nguyên

2

(2)

i

int

số nguyên

4

(2)

I

unsigned int

số nguyên

4

(2)

l

long

số nguyên

4

(2)

L

unsigned long

số nguyên

4

(2)

q

long long

số nguyên

8

(2)

Q

unsigned long long

số nguyên

8

(2)

n

ssize_t

số nguyên

(3)

N

size_t

số nguyên

(3)

e

_Float16

phao

2

(4), (6)

f

float

phao

4

(4)

d

double

phao

8

(4)

F

float complex

phức tạp

8

(10)

D

double complex

phức tạp

16

(10)

s

char[]

byte

(9)

p

char[]

byte

(8)

P

void*

số nguyên

(5)

Thay đổi trong phiên bản 3.3: Đã thêm hỗ trợ cho các định dạng 'n''N'.

Thay đổi trong phiên bản 3.6: Đã thêm hỗ trợ cho định dạng 'e'.

Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ cho các định dạng 'F''D'.

Xem thêm

Các mô-đun arrayctypes, cũng như các mô-đun của bên thứ ba như numpy, sử dụng mã loại tương tự -- nhưng hơi khác một chút.

Ghi chú:

  1. Mã chuyển đổi '?' tương ứng với loại _Bool được xác định theo tiêu chuẩn C kể từ C99. Ở chế độ tiêu chuẩn, nó được biểu thị bằng một byte.

  2. Khi cố gắng đóng gói một số không nguyên bằng cách sử dụng bất kỳ mã chuyển đổi số nguyên nào, nếu số không phải số nguyên có phương thức __index__() thì phương thức đó sẽ được gọi để chuyển đổi đối số thành số nguyên trước khi đóng gói.

    Thay đổi trong phiên bản 3.2: Đã thêm việc sử dụng phương thức __index__() cho các số không nguyên.

  3. Mã chuyển đổi 'n''N' chỉ có sẵn cho kích thước gốc (được chọn làm mặc định hoặc với ký tự thứ tự byte '@'). Đối với kích thước tiêu chuẩn, bạn có thể sử dụng bất kỳ định dạng số nguyên nào khác phù hợp với ứng dụng của bạn.

  4. Đối với các mã chuyển đổi 'f', 'd''e', biểu diễn đóng gói sử dụng định dạng IEEE 754 nhị phân32, nhị phân64 hoặc nhị phân16 (tương ứng cho 'f', 'd' hoặc 'e'), bất kể định dạng dấu phẩy động được nền tảng sử dụng.

  5. Ký tự định dạng 'P' chỉ khả dụng cho thứ tự byte gốc (được chọn làm mặc định hoặc với ký tự thứ tự byte '@'). Ký tự thứ tự byte '=' chọn sử dụng thứ tự cuối nhỏ hoặc lớn dựa trên hệ thống máy chủ. Mô-đun struct không hiểu đây là thứ tự gốc, vì vậy định dạng 'P' không khả dụng.

  6. Loại "nửa chính xác" IEEE 754 nhị phân16 được giới thiệu trong bản sửa đổi năm 2008 của IEEE 754 standard. Nó có một bit dấu, số mũ 5 bit và độ chính xác 11 bit (với 10 bit được lưu trữ rõ ràng) và có thể biểu thị các số trong khoảng từ 6.1e-05 đến 6.5e+04 với độ chính xác hoàn toàn. Loại này không được trình biên dịch C hỗ trợ rộng rãi: nó có sẵn dưới dạng loại _Float16, nếu trình biên dịch hỗ trợ Phụ lục H của tiêu chuẩn C23. Trên một máy thông thường, một đoạn ngắn không dấu có thể được sử dụng để lưu trữ chứ không phải cho các phép toán. Xem trang Wikipedia trên half-precision floating-point format để biết thêm thông tin.

  7. Khi đóng gói, 'x' chèn một byte NUL.

  8. Ký tự định dạng 'p' mã hóa "chuỗi Pascal", nghĩa là một chuỗi ngắn có độ dài thay đổi được lưu trữ trong fixed number of bytes, được cung cấp bởi số lượng. Byte đầu tiên được lưu trữ là độ dài của chuỗi hoặc 255, tùy theo giá trị nào nhỏ hơn. Các byte của chuỗi theo sau. Nếu chuỗi được chuyển vào pack() quá dài (dài hơn số trừ 1), thì chỉ các byte count-1 đầu của chuỗi được lưu trữ. Nếu chuỗi ngắn hơn count-1, chuỗi đó sẽ được đệm bằng các byte rỗng để đếm chính xác tất cả các byte được sử dụng. Lưu ý rằng đối với unpack(), ký tự định dạng 'p' tiêu thụ byte count nhưng chuỗi được trả về không bao giờ có thể chứa nhiều hơn 255 byte.

  9. Đối với ký tự định dạng 's', số đếm được hiểu là độ dài của byte, không phải số lần lặp lại như đối với các ký tự định dạng khác; ví dụ: '10s' có nghĩa là ánh xạ chuỗi 10 byte đơn đến hoặc từ một chuỗi byte Python đơn, trong khi '10c' có nghĩa là 10 phần tử ký tự một byte riêng biệt (ví dụ: cccccccccc) ánh xạ tới hoặc từ mười đối tượng byte Python khác nhau. (Xem Ví dụ để biết minh họa cụ thể về sự khác biệt.) Nếu không đưa ra số đếm, nó sẽ mặc định là 1. Để đóng gói, chuỗi được cắt ngắn hoặc đệm bằng các byte rỗng cho phù hợp để làm cho nó phù hợp. Để giải nén, đối tượng byte kết quả luôn có chính xác số byte được chỉ định. Trong trường hợp đặc biệt, '0s' có nghĩa là một chuỗi trống, đơn (trong khi '0c' có nghĩa là 0 ký tự).

  10. Đối với các ký tự định dạng 'F''D', biểu diễn đóng gói sử dụng định dạng IEEE 754 nhị phân32 và nhị phân64 cho các thành phần của số phức, bất kể định dạng dấu phẩy động được nền tảng sử dụng. Lưu ý rằng các loại phức tạp (FD) có sẵn vô điều kiện, mặc dù các loại phức tạp là một tính năng tùy chọn trong C. Như được chỉ định trong tiêu chuẩn C11, mỗi loại phức tạp được biểu thị bằng một mảng C hai phần tử chứa tương ứng phần thực và phần ảo.

Một ký tự định dạng có thể được đặt trước bởi số lần lặp lại tích phân. Ví dụ: chuỗi định dạng '4h' có nghĩa giống hệt như 'hhhh'.

Ký tự khoảng trắng giữa các định dạng bị bỏ qua; Tuy nhiên, số đếm và định dạng của nó không được chứa khoảng trắng.

Khi đóng gói một giá trị x bằng một trong các định dạng số nguyên ('b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q'), nếu x nằm ngoài phạm vi hợp lệ cho định dạng đó thì struct.error sẽ được nâng lên.

Thay đổi trong phiên bản 3.1: Trước đây, một số định dạng số nguyên bao bọc các giá trị ngoài phạm vi và tăng DeprecationWarning thay vì struct.error.

Đối với ký tự định dạng '?', giá trị trả về là True hoặc False. Khi đóng gói, giá trị thật của đối tượng đối số sẽ được sử dụng. 0 hoặc 1 trong biểu diễn bool gốc hoặc tiêu chuẩn sẽ được đóng gói và mọi giá trị khác 0 sẽ là True khi giải nén.

Ví dụ

Ghi chú

Các ví dụ về thứ tự byte gốc (được chỉ định bởi tiền tố định dạng '@' hoặc thiếu bất kỳ ký tự tiền tố nào) có thể không khớp với những gì máy của trình đọc tạo ra vì điều đó phụ thuộc vào nền tảng và trình biên dịch.

Đóng gói và giải nén các số nguyên có ba kích cỡ khác nhau, sử dụng thứ tự endian lớn:

>>> từ nhập cấu trúc *
>>> gói(">bhl", 1, 2, 3)
b'\x01\x00\x02\x00\x00\x00\x03'
>>> giải nén('>bhl', b'\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> vôi hóa('>bhl')
7

Cố gắng đóng gói một số nguyên quá lớn đối với trường được xác định:

>>> gói(">h", 99999)
Traceback (cuộc gọi gần đây nhất):
  Tệp "<stdin>", dòng 1, trong <module>
struct.error: định dạng 'h' yêu cầu -32768 <= số <= 32767

Chứng minh sự khác biệt giữa các ký tự định dạng 's''c':

>>> gói("@ccc", b'1', b'2', b'3')
b'123'
>>> gói("@3s", b'123')
b'123'

Các trường đã giải nén có thể được đặt tên bằng cách gán chúng cho các biến hoặc bằng cách gói kết quả vào một bộ dữ liệu được đặt tên

>>> record = b'raymond \x32\x12\x08\x01\x08'
>>> tên, số serial, trường, cấp lớp = giải nén('<10sHHb', record)

>>> từ bộ sưu tập nhập têntuple
>>> Sinh viên = têntuple('Học sinh', 'tên trường cấp lớp')
>>> Sinh viên._make(giải nén('<10sHHb', record))
Học sinh(name=b'raymond ', serialnum=4658, school=264, Gradelevel=8)

Thứ tự của các ký tự định dạng có thể có tác động đến kích thước ở chế độ gốc vì phần đệm là ẩn. Ở chế độ tiêu chuẩn, người dùng có trách nhiệm chèn bất kỳ phần đệm mong muốn nào. Lưu ý trong lệnh gọi pack đầu tiên bên dưới rằng ba byte NUL đã được thêm vào sau '#' được đóng gói để căn chỉnh số nguyên sau trên ranh giới bốn byte. Trong ví dụ này, kết quả đầu ra được tạo ra trên một máy endian nhỏ:

>>> gói('@ci', b'#', 0x12131415)
b'#\x00\x00\x00\x15\x14\x13\x12'
>>> gói('@ic', 0x12131415, b'#')
b'\x15\x14\x13\x12#'
>>> calcsize('@ci')
8
>>> calcsize('@ic')
5

Định dạng 'llh0l' sau đây dẫn đến hai byte đệm được thêm vào cuối, giả sử độ dài của nền tảng được căn chỉnh trên ranh giới 4 byte:

>>> gói('@llh0l', 1, 2, 3)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'

Xem thêm

Mô-đun array

Lưu trữ nhị phân đóng gói dữ liệu đồng nhất.

Mô-đun json

bộ mã hóa và giải mã JSON.

Mô-đun pickle

Tuần tự hóa đối tượng Python.

Ứng dụng

Có hai ứng dụng chính cho mô-đun struct, trao đổi dữ liệu giữa mã Python và C trong một ứng dụng hoặc ứng dụng khác được biên dịch bằng cùng một trình biên dịch (native formats) và trao đổi dữ liệu giữa các ứng dụng sử dụng bố cục dữ liệu đã thỏa thuận (standard formats). Nói chung, các chuỗi định dạng được xây dựng cho hai miền này là khác nhau.

Định dạng gốc

Khi xây dựng các chuỗi định dạng bắt chước bố cục gốc, trình biên dịch và kiến trúc máy sẽ xác định thứ tự byte và phần đệm. Trong những trường hợp như vậy, nên sử dụng ký tự định dạng @ để chỉ định thứ tự byte gốc và kích thước dữ liệu. Các byte đệm bên trong thường được chèn tự động. Có thể cần có mã định dạng không lặp lại ở cuối chuỗi định dạng để làm tròn đến ranh giới byte chính xác để căn chỉnh chính xác các khối dữ liệu liên tiếp.

Hãy xem xét hai ví dụ đơn giản sau (trên máy 64-bit, little-endian):

>>> vôi hóa('@lhl')
24
>>> vôi hóa('@llh')
18

Dữ liệu không được đệm vào ranh giới 8 byte ở cuối chuỗi định dạng thứ hai mà không sử dụng phần đệm bổ sung. Mã định dạng không lặp lại sẽ giải quyết vấn đề đó

>>> calcsize('@llh0l')
24

Mã định dạng 'x' có thể được sử dụng để chỉ định lặp lại, nhưng đối với các định dạng gốc, tốt hơn nên sử dụng định dạng không lặp lại như '0l'.

Theo mặc định, thứ tự và căn chỉnh byte gốc được sử dụng, nhưng tốt hơn là nên rõ ràng và sử dụng ký tự tiền tố '@'.

Định dạng chuẩn

Khi trao đổi dữ liệu ngoài quy trình của bạn như kết nối mạng hoặc lưu trữ, hãy chính xác. Chỉ định thứ tự byte, kích thước và căn chỉnh chính xác. Đừng cho rằng chúng khớp với thứ tự gốc của một máy cụ thể. Ví dụ: thứ tự byte mạng là endian lớn, trong khi nhiều CPU phổ biến là endian nhỏ. Bằng cách xác định điều này một cách rõ ràng, người dùng không cần quan tâm đến các chi tiết cụ thể của nền tảng mà mã của họ đang chạy. Ký tự đầu tiên thường là < hoặc > (hoặc !). Việc đệm là trách nhiệm của người lập trình. Ký tự định dạng không lặp lại sẽ không hoạt động. Thay vào đó, người dùng phải thêm byte đệm 'x' một cách rõ ràng khi cần. Xem lại các ví dụ ở phần trước, chúng ta có:

>>> calcsize('<qh6xq')
24
>>> gói('<qh6xq', 1, 2, 3) == gói('@lhl', 1, 2, 3)
đúng
>>> vôi hóa('@llh')
18
>>> gói('@llh', 1, 2, 3) == gói('<qqh', 1, 2, 3)
đúng
>>> calcsize('<qqh6x')
24
>>> calcsize('@llh0l')
24
>>> gói('@llh0l', 1, 2, 3) == gói('<qqh6x', 1, 2, 3)
đúng

Các kết quả trên (được thực thi trên máy 64 bit) không được đảm bảo khớp khi được thực thi trên các máy khác nhau. Ví dụ: các ví dụ bên dưới được thực thi trên máy 32 bit:

>>> calcsize('<qqh6x')
24
>>> calcsize('@llh0l')
12
>>> gói('@llh0l', 1, 2, 3) == gói('<qqh6x', 1, 2, 3)
sai

Lớp học

Mô-đun struct cũng xác định loại sau:

class struct.Struct(format)

Trả về một đối tượng Struct mới ghi và đọc dữ liệu nhị phân theo chuỗi định dạng format. Tạo một đối tượng Struct một lần và gọi các phương thức của nó sẽ hiệu quả hơn so với việc gọi các hàm cấp mô-đun có cùng định dạng vì chuỗi định dạng chỉ được biên dịch một lần.

Ghi chú

Các phiên bản đã biên dịch của chuỗi định dạng gần đây nhất được chuyển đến các hàm cấp mô-đun được lưu vào bộ nhớ đệm, do đó các chương trình chỉ sử dụng một vài chuỗi định dạng không cần phải lo lắng về việc sử dụng lại một phiên bản Struct duy nhất.

Các đối tượng Struct được biên dịch hỗ trợ các phương thức và thuộc tính sau:

pack(v1, v2, ...)

Giống hệt hàm pack(), sử dụng định dạng đã biên dịch. (len(result) sẽ bằng size.)

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

Giống hệt hàm pack_into(), sử dụng định dạng đã biên dịch.

unpack(buffer)

Giống hệt hàm unpack(), sử dụng định dạng đã biên dịch. Kích thước của bộ đệm tính bằng byte phải bằng size.

unpack_from(buffer, offset=0)

Giống hệt hàm unpack_from(), sử dụng định dạng đã biên dịch. Kích thước của bộ đệm tính bằng byte, bắt đầu từ vị trí offset, ít nhất phải là size.

iter_unpack(buffer)

Giống hệt hàm iter_unpack(), sử dụng định dạng đã biên dịch. Kích thước của bộ đệm tính bằng byte phải là bội số của size.

Added in version 3.4.

format

Chuỗi định dạng được sử dụng để xây dựng đối tượng Struct này.

Thay đổi trong phiên bản 3.7: Loại chuỗi định dạng bây giờ là str thay vì bytes.

size

Kích thước được tính toán của cấu trúc (và do đó của đối tượng byte được tạo bằng phương thức pack()) tương ứng với format.

Thay đổi trong phiên bản 3.13: repr() của cấu trúc đã thay đổi. Bây giờ là:

>>> Struct('i')
Struct('i')