Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Binary Data Services


บทบัญญัติของโมดูล struct ในไลบรารี Python มีประโยชน์ในการแปลงระหว่างโครงสร้างประเภท C และอ็อบเจ็กต์ Python byte ซึ่งสามารถทำได้โดยฟังก์ชันระดับโมดูล เช่นเดียวกับคลาส Struct และเมธอดตามที่กำหนดไว้ในโมดูล struct

ฟังก์ชันการแปลงใช้สตริงรูปแบบ ลำดับไบต์ ขนาด และการจัดตำแหน่งที่ใช้ในสตริงรูปแบบถูกกำหนดโดยการจัดรูปแบบอักขระตามตารางต่อไปนี้

ตัวละคร
ลำดับไบต์
ขนาด
การจัดตำแหน่ง
@
เนทีฟ
ดั้งเดิม
เนทีฟ
=
เนทีฟ
มาตรฐาน
ไม่มี
<
little-endian
มาตรฐาน
ไม่มี
>
big-endian
มาตรฐาน
ไม่มี
!
เครือข่าย (=big-endian)
มาตรฐาน
ไม่มี

ตารางต่อไปนี้แสดงรูปแบบอักขระที่ใช้เพื่อแสดงตัวแปรประเภท C และประเภท Python ที่เกี่ยวข้อง

รูปแบบ
C Type
ประเภทหลาม
x
แผ่นไบต์
ไม่มีค่า

ถ่าน
ไบต์ของความยาว 1
b/B
เครื่องหมาย/ไม่ได้ลงนาม char
จำนวนเต็ม
?
_Bool
บูล
h/H
short/unsigned short
จำนวนเต็ม
i/I
int/unsigned int
จำนวนเต็ม
l/L
long/unsigned long
จำนวนเต็ม
f
ลอยตัว
ลอยตัว
d
สองเท่า
ลอยตัว
s
ถ่าน[]
ไบต์
p
ถ่าน[]
ไบต์

เป็นโมฆะ *
จำนวนเต็ม

ฟังก์ชันต่อไปนี้ถูกกำหนดไว้ในโมดูล struct

แพ็ค()

ฟังก์ชันนี้ส่งคืนอ็อบเจ็กต์ไบต์ที่มีค่าที่บรรจุตามรูปแบบสตริงรูปแบบ อักขระการจัดรูปแบบต้องตรงกับค่าที่กำหนดโดยรูปแบบ

แกะ()

ฟังก์ชันนี้จะแตกไฟล์ออกจากบัฟเฟอร์ตามรูปแบบสตริงของรูปแบบ ผลลัพธ์คือทูเพิลแม้ว่าจะมีเพียงรายการเดียวก็ตาม

โค้ดต่อไปนี้แสดงให้เห็นถึงการใช้ฟังก์ชันเหล่านี้

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)

ผลลัพธ์

packed data: b'\x01\x00\x00\x00Rahul\x00\x00\x00\x00\x80\x83B'
unpacked data: (1, b'Rahul', 65.75)

การบรรจุ/การเปิดออกสามารถทำได้โดยใช้วิธีการในคลาสโครงสร้าง การสร้างออบเจ็กต์ Struct หนึ่งครั้งและการเรียกใช้เมธอดของออบเจ็กต์นั้นมีประสิทธิภาพมากกว่าการเรียกใช้ฟังก์ชัน struct ด้วยรูปแบบเดียวกัน เนื่องจากสตริงรูปแบบจะต้องคอมไพล์เพียงครั้งเดียว

โครงสร้าง(รูปแบบ)

ตัวสร้างนี้ส่งคืนอ็อบเจ็กต์ Struct ใหม่ที่เขียนและอ่านข้อมูลไบนารีตามรูปแบบสตริงรูปแบบ

แพ็ค()

เมธอดนี้เหมือนกับฟังก์ชัน pack() โดยใช้รูปแบบที่คอมไพล์แล้ว

แกะ()

เมธอดนี้เหมือนกับฟังก์ชัน unpack() โดยใช้รูปแบบที่คอมไพล์แล้ว

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าคลาส Struct ใช้ในการแพ็คและแกะข้อมูล Python อย่างไร

s = struct.Struct('I 5s f')
packed=s.pack(*student)
print (packed)
unpacked = s.unpack(packed)
print (unpacked)

ข้อมูลที่บรรจุสามารถแยกวิเคราะห์โดยตรงไปยังอ็อบเจ็กต์ tuple ที่มีชื่อได้

from collections import namedtuple
newstudent = namedtuple('newstudent','No Name Marks')
s1 = newstudent._make(struct.unpack('I 5s f', packed))
print (s1)

ผลลัพธ์

newstudent(No=1, Name=b'Rahul', Marks=65.75)