Jak przekonwertować surowe wartości Big-Endian w Python
Pliki PSD przechowują większość pól binarnych w kolejności bajtów big-endian. Kiedy musisz samodzielnie zdekodować surowe pole — na przykład z surowych bajtów zasobu obrazu — BigEndianBitConverter odczytuje 32-bitową liczbę całkowitą big-endian bezpośrednio z tablicy bajtów.
Przewodnik krok po kroku
Krok 1: Zainstaluj pakiet
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:$PYTHONPATHKrok 2: Zaimportuj wymagane klasy
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.bigendianbitconverter import BigEndianBitConverterKrok 3: Odczytaj surowe bajty zasobu
PsdImage.parsed_resources zwraca niższego poziomu obiekty UnknownResource, z których każdy udostępnia surowe dane za pośrednictwem data:
image = PsdImage.load("input.psd")
for resource in image.parsed_resources:
raw = resource.dataKrok 4: Dekodowanie 32-bitowej wartości 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) odczytuje 4 bajty zaczynając od offset i łączy je w kolejności od najważniejszego bajtu.
Typowe problemy i rozwiązania
IndexError przy wywoływaniu to_int32. Tablica bajtów musi mieć przynajmniej 4 bajty dostępne począwszy od offset — sprawdź len(byte_array) >= offset + 4 przed wywołaniem.
Wartości wyglądają na zamienione bajtowo. Upewnij się, że nie używasz przypadkowo konwersji little-endian w innym miejscu swojego kodu — zasoby PSD i pola nagłówka są konsekwentnie big-endian, co dokładnie BigEndianBitConverter zakłada.
Najczęściej zadawane pytania
Czy BigEndianBitConverter obsługuje inne rozmiary liczb całkowitych?
W tej wersji FOSS, BigEndianBitConverter zapewnia jedynie to_int32 — dla wartości 16-bitowych lub 64-bitowych big-endian, dekoduj bajty ręcznie przy użyciu wbudowanego w Python int.from_bytes(data, byteorder="big").
Czy potrzebuję tego przy normalnej edycji dokumentów?
Nie — BigEndianBitConverter jest niskopoziomowym narzędziem do pracy z surowymi bajtami, które samodzielnie pozyskałeś (na przykład z nierozpoznanego zasobu obrazu). Typowe ładowanie, edycja i zapisywanie (zobacz Praca z rdzeniem API) nigdy nie wymaga go bezpośrednio.