Как преобразовать необработанные значения 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}") # 1040to_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) никогда не требует его напрямую.