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