Cách chuyển đổi giá trị Raw Big-Endian trong Python

Cách chuyển đổi giá trị Raw Big-Endian trong Python

Các tệp PSD lưu trữ hầu hết các trường nhị phân theo thứ tự byte big-endian. Khi bạn cần tự giải mã một trường raw — ví dụ, từ các byte thô của tài nguyên hình ảnh — BigEndianBitConverter sẽ đọc một số nguyên 32-bit big-endian trực tiếp từ mảng byte.

Hướng dẫn từng bước

Bước 1: Cài đặt gói

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

Bước 2: Nhập các lớp cần thiết

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

Bước 3: Đọc dữ liệu raw của tài nguyên

PsdImage.parsed_resources trả về các đối tượng UnknownResource cấp thấp hơn, mỗi đối tượng tiết lộ tải trọng thô thông qua data:

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

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

Bước 4: Giải mã Giá trị 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) đọc 4 byte bắt đầu tại offset và kết hợp chúng theo thứ tự byte có giá trị cao nhất trước.

Các vấn đề thường gặp và cách khắc phục

IndexError khi gọi to_int32. Mảng byte phải có ít nhất 4 byte khả dụng bắt đầu từ offset — kiểm tra len(byte_array) >= offset + 4 trước khi gọi.

Các giá trị dường như đã bị hoán byte. Xác nhận rằng bạn không vô tình sử dụng chuyển đổi little-endian ở đâu khác trong mã của mình — tài nguyên PSD và các trường tiêu đề luôn sử dụng big-endian, điều này chính là những gì BigEndianBitConverter giả định.

Câu hỏi thường gặp

Liệu BigEndianBitConverter có hỗ trợ các kích thước số nguyên khác không?

Trong bản dựng FOSS này, BigEndianBitConverter chỉ cung cấp to_int32 — đối với các giá trị big-endian 16-bit hoặc 64-bit, hãy tự giải mã các byte bằng int.from_bytes(data, byteorder="big") tích hợp của Python.

Tôi có cần nó cho việc chỉnh sửa tài liệu thông thường không?

Không — BigEndianBitConverter là một tiện ích cấp thấp để xử lý các byte thô mà bạn tự thu thập (ví dụ, từ một tài nguyên hình ảnh không được nhận dạng). Việc tải, chỉnh sửa và lưu thông thường (xem Sử dụng Core API) không bao giờ yêu cầu nó trực tiếp.

Xem thêm

 Tiếng Việt