Computer >> Máy Tính >  >> Lập trình >> Python

Dịch vụ dữ liệu nhị phân Python

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)