Trudności ze zrozumieniem endianizmu


2

Załóżmy, że otwieram plik tiff w emacsie i widzę następujące w trybie hexl:

0x08000400

i wiem, że plik jest mały endian. Czy to oznacza, że ​​liczba wynosi 262152 w systemie dziesiętnym, lub

0x00040008 

w heksie? Czy ta konwersja na liczbę dziesiętną byłaby inna, gdyby była 8-bitowa vs. 16-bitowa?


Czy to nie zależy od formatu pliku?
caliban

Chodzi mi o to, że nie sądzę, że format pliku ma znaczenie dla nagłówka tiff ... myślę, że jest spójny, a format pliku ma wpływ tylko przy opisie surowych danych obrazu.
Tony Stark,

Odpowiedzi:


2

Dla wartości 8-bitowych endianność nie ma znaczenia.
Poza tym ważna jest struktura danych pola.

Jeśli pracujesz z małym plikiem endian jako strumieniem bajtów (jak pokazano tutaj),
16-bitowa wartość ma niższy bajt przed swoim wyższym bajtem. Zatem „0x08 0x00” jest wartością 8.

Być może już to wiesz, ale warto to zauważyć.
Od strony TIFF Wikipedia ,

Każdy TIFF zaczyna się 2-bajtowym wskaźnikiem kolejności bajtów:
„II” dla małego endiana i „MM” dla porządkowania dużych bajtów endian.
Kolejne 2 bajty reprezentują
wybraną liczbę 42, ponieważ jest to wzór binarny 101010 i
„ze względu na jego głębokie znaczenie filozoficzne ”.

42-odczyt zależy od kolejności bajtów wskazanej przez 2-bajtowy wskaźnik.
Wszystkie słowa, podwójne słowa itp. W pliku TIFF są odczytywane zgodnie ze wskazaną kolejnością bajtów.

Specyfikacja TIFF 6.0 mówi, że zgodne czytniki TIFF muszą obsługiwać obie kolejności bajtów (II i MM), jednak autorzy TIFF mogą wybrać kolejność bajtów dogodną dla ich obrazu. To wywołało żart społeczności zajmującej się przetwarzaniem obrazów, że TIFF to skrót od tysięcy niezgodnych formatów plików.


więc tylko dla wyjaśnienia: 0x08000400 w pliku w małym endianie powinno być czytane jako 0x00040008 w świecie rzeczywistym, czyli 262152 w systemie dziesiętnym, prawda? również w tym przykładzie, czy liczba ta byłaby liczbą 32-bitową (4 pary szesnastkowe ...)?
Tony Stark,

1
@hatorade, należy pamiętać, że 0x08000400różni się od 0x08 0x00 0x04 0x00. Pierwsze jest 32-bitowym słowem i zawiera założenia dotyczące endianowości, drugie to sekwencja bajtów, w której endianowość nie jest istotna.
nik

@nik: czy 08:00 tłumaczy się na 0x08 0x00 lub 0x0800? Miałem na myśli to drugie. W razie potrzeby mogę edytować swój post.
Tony Stark,

1
Oczekuję, że :separatory „ ” sugerują sekwencję bajtów (z rozwiązaniem endianness). Nazywany także „ octet stream”.
nik
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.