Как преобразовать необработанные значения Big-Endian в Python

Как преобразовать необработанные значения 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, каждый из которых предоставляет необработанные данные через data:

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

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

Шаг 4: Декодировать 32-битное значение 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-битных или 64-битных значений в большом порядке байтов вручную декодируйте байты с помощью встроенного int.from_bytes(data, byteorder="big") Python.

Нужен ли мне это для обычного редактирования документов?

Нет — BigEndianBitConverter является утилитой низкого уровня для работы с необработанными байтами, полученными вами (например, из нераспознанного ресурса изображения). Обычная загрузка, редактирование и сохранение (см Работа с ядром API) никогда не требует его напрямую.

См. также:

 Русский