วิธีแปลงค่า Raw Big-Endian ใน Python

วิธีแปลงค่า Raw Big-Endian ใน Python

ไฟล์ PSD เก็บฟิลด์ไบนารีส่วนใหญ่ในลำดับไบต์แบบ big-endian เมื่อคุณต้องการถอดรหัสฟิลด์ดิบด้วยตัวเอง — ตัวอย่างเช่น จากไบต์ดิบของทรัพยากรภาพ — BigEndianBitConverter จะอ่านจำนวนเต็ม 32-บิตแบบ big-endian โดยตรงจากอาเรย์ไบต์.

คู่มือแบบทีละขั้นตอน

ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ

git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-Python.git
cd Aspose.PSD-FOSS-for-Python
# No packaging manifest is published yet -- run from this folder,
# or add it to PYTHONPATH:
export PYTHONPATH=$PWD:$PYTHONPATH

ขั้นตอนที่ 2: นำเข้าคลาสที่ต้องการ

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.bigendianbitconverter import BigEndianBitConverter

ขั้นตอนที่ 3: อ่านไบต์ดิบของทรัพยากร

PsdImage.parsed_resources คืนค่าอ็อบเจ็กต์ UnknownResource ระดับล่างแต่ละอันโดยเปิดเผย payload ดิบผ่าน data:

image = PsdImage.load("input.psd")

for resource in image.parsed_resources:
    raw = resource.data

ขั้นตอนที่ 4: ถอดรหัสค่า 32-Bit แบบ Big-Endian

data = bytes([0x00, 0x00, 0x04, 0x10])  # example 4-byte big-endian field
value = BigEndianBitConverter.to_int32(data, 0)
print(f"Decoded value: {value}")  # 1040

to_int32(byte_array, offset) อ่าน 4 ไบต์เริ่มจาก offset แล้วรวมเข้าด้วยกันโดยเรียงลำดับไบต์ที่สำคัญที่สุดก่อน.

ปัญหาทั่วไปและวิธีแก้

IndexError เมื่อเรียกใช้ to_int32. อาเรย์ไบต์ต้องมีอย่างน้อย 4 ไบต์พร้อมใช้งานเริ่มจาก offset — ตรวจสอบ len(byte_array) >= offset + 4 ก่อนเรียกใช้.

ค่าเหล่านี้ดูเหมือนถูกสลับไบต์. ยืนยันว่าคุณไม่ได้โดยบังเอิญใช้การแปลง little-endian ที่อื่นในโค้ดของคุณ — ทรัพยากร PSD และฟิลด์หัวเรื่องเป็น big-endian อย่างสม่ำเสมอ ซึ่งเป็นสิ่งที่ BigEndianBitConverter สมมติ.

คำถามที่พบบ่อย

BigEndianBitConverter รองรับขนาดจำนวนเต็มอื่น ๆ หรือไม่?

ในรุ่น FOSS นี้, BigEndianBitConverter ให้เฉพาะ to_int32 — สำหรับค่าขนาด 16-bit หรือ 64-bit แบบ big-endian, ให้ถอดรหัสไบต์ด้วยตนเองโดยใช้ Python ที่มี int.from_bytes(data, byteorder="big") ในตัว.

ฉันต้องการสิ่งนี้สำหรับการแก้ไขเอกสารทั่วไปหรือไม่?

ไม่ — BigEndianBitConverter เป็นยูทิลิตี้ระดับล่างสำหรับทำงานกับไบต์ดิบที่คุณได้มาด้วยตนเอง (เช่น จากแหล่งภาพที่ไม่รู้จัก) การโหลด แก้ไข และบันทึกตามปกติ (ดู การทำงานกับ Core API) ไม่จำเป็นต้องใช้โดยตรงเลย.

ดูเพิ่มเติม

 ภาษาไทย