บทบัญญัติของโมดูล 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)