Các quy định của mô-đun struct trong thư viện Python hữu ích trong việc thực hiện chuyển đổi giữa cấu trúc kiểu C và đối tượng byte Python. Điều này có thể đạt được bằng các hàm cấp mô-đun cũng như lớp Struct và các phương thức của nó như được định nghĩa trong mô-đun struct.
Các hàm chuyển đổi sử dụng một chuỗi định dạng. Thứ tự byte, kích thước và căn chỉnh được sử dụng trong chuỗi định dạng được xác định bằng cách định dạng ký tự theo bảng sau
Ký tự | Thứ tự byte | Kích thước | Căn chỉnh |
---|---|---|---|
@ | gốc | gốc | gốc |
= | gốc | tiêu chuẩn | không có |
< | little-endian | tiêu chuẩn | không có |
> | big-endian | tiêu chuẩn | không có |
! | mạng (=big-endian) | tiêu chuẩn | không có |
Bảng sau hiển thị các ký tự định dạng được sử dụng để biểu thị các biến loại C và các loại Python tương ứng.
Định dạng | Loại C | Loại Python |
---|---|---|
x | byte đệm | không có giá trị |
c | ký tự | byte độ dài 1 |
b / B | ký tự có dấu / chưa ký | số nguyên |
? | _ Bool | bool |
h / H | ngắn / không có dấu | số nguyên |
i / I | int / unsigned int | số nguyên |
l / L | dài / dài không dấu | số nguyên |
f | float | float |
d | gấp đôi | float |
s | char [] | byte |
p | char [] | byte |
P | void * | số nguyên |
Các chức năng sau được định nghĩa trong mô-đun struct
pack ()
Hàm này trả về một đối tượng byte chứa các giá trị được đóng gói theo định dạng chuỗi định dạng. Các ký tự định dạng phải khớp với các giá trị mà định dạng yêu cầu.
giải nén ()
Hàm này giải nén từ bộ đệm theo định dạng chuỗi định dạng. Kết quả là một bộ giá trị ngay cả khi nó chứa chính xác một mục.
Đoạn mã sau minh họa việc sử dụng các chức năng này.
import struct student=(1, b'Rahul', 65.75) packed=struct.pack('I 5s f', *student) print ('packed data:',packed) unpacked=struct.unpack('I 5s f', packed) print ('unpacked data:',unpacked)
Đầu ra
packed data: b'\x01\x00\x00\x00Rahul\x00\x00\x00\x00\x80\x83B' unpacked data: (1, b'Rahul', 65.75)
Đóng gói / giải nén cũng có thể đạt được bằng cách sử dụng các phương thức trong lớp Struct. 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 struct với cùng một định dạng vì chuỗi định dạng chỉ cần được biên dịch một lần.
Cấu trúc (định dạng)
Hàm tạo này trả về một đối tượng Struct mới ghi và đọc dữ liệu nhị phân theo định dạng chuỗi định dạng.
pack ()
Phương thức này giống với hàm pack (), sử dụng định dạng đã biên dịch.
giải nén ()
Phương thức này giống với hàm unpack (), sử dụng định dạng đã biên dịch.
Ví dụ sau cho thấy cách lớp Struct được sử dụng để đóng gói và giải nén dữ liệu Python.
s = struct.Struct('I 5s f') packed=s.pack(*student) print (packed) unpacked = s.unpack(packed) print (unpacked)
Dữ liệu được đóng gói có thể được phân tích cú pháp trực tiếp thành một đối tượng tuple được đặt tên.
from collections import namedtuple newstudent = namedtuple('newstudent','No Name Marks') s1 = newstudent._make(struct.unpack('I 5s f', packed)) print (s1)
Đầu ra
newstudent(No=1, Name=b'Rahul', Marks=65.75)