Wo steht, ob eine Datei big, little oder bi-endian codiert ist?

  • Themenstarter Themenstarter Xyz1
  • Beginndatum Beginndatum
X

Xyz1

Gast
Hallo, beschäftige mich gerade mit theoretischen Fragen zu Filesystemen - und diese Frage (des Endianness) weiß ich nicht. Ihr? Und wieso sind 1:1 disk dumps dennoch möglich?
 
Im Zweifel steht es in der Spezifikation des Dateiformates. Ansonsten kann man diese Eigenschaft der Datei nicht ohne Weiteres (z.B. mit Wissen um valide Werte(-bereiche) an bestimmten Byte-Offsets) ansehen. Endianness gibt ja nur an, wie Multibyte Werte (also z.B. 16-bit oder 32-bit Integer oder Fließkommawerte) interpretiert werden sollen. Was die Datei selber betrifft, ist es ja immer einfach eine Ansammlung von Bytes. Wie diese zu interpretieren sind, ist Anwendungssache.

Zum Beispiel, angenommen, du hast eine Datei, die aus vier Bytes besteht, in Hexadezimal:

0x01 0x00 0x00 0x00

Das kann eine in Little Endian kodierte `1` als 4-Byte Ganzzahl sein oder eine in Big Endian kodierte `16.777.216` als 4-byte Ganzzahl. Oder einfach nur das Byte `1` gefolgt von drei `0`-Bytes. Oder aber eine 2-Byte Ganzzahl `256` (als Big Endian) gefolgt von einer 2-Byte Ganzzahl `0`. Oder aber eine 2-Byte Ganzzahl `1` (als Little Endian) gefolgt von einer 2-Byte Ganzzahl `0`. Oder oder oder...
 
Zuletzt bearbeitet:
Da möchte ich dann auch noch kurz ein paar Erläuterungen hinzufügen / ergänzen (Da ja auch Filesysteme angesprochen wurden):

Endianness oder auf Deutsch Byte-Reihenfolge legt fest, in welcher Reihenfolge die Werte, die aus mehreren Bytes bestehen, geschrieben werden.

Little-Endian schreibt den kleinsten Wert zuerst, Big-Endian den größten.

Wenn man dies statt mit Bytes mit Ziffern des Zehnersystems darstellen würde, dann hätte man z.B. die Ziffern:

8,9

Bei Big-Endian kommt der größte Wert, hier der Zehner, zuerst, so dass die Ziffern 8,9 der Zahl Neunundachzig entspricht.
Bei Little-Endian kommt die kleinste Ziffer zuerst, d.h. zuerst würde die Einerstelle und dann die Zehnerstelle gebracht so dass wir bei der Zahl Achtundneunzig wären.

Die Unterscheidung zwischen diesen Systemen hat sich in erster Linie bei de Architekturen gezeigt. So sind z.B. x86, DEC Alpha, ... Little-Endian.
Big-Endian Beispiele wären IBM-Mainframe, MIPS, SPARC, 68k ... (Interessant: Alpha CPUs können auch in einem Big-Endian Modus laufen, was aber unüblich ist...)

Nun ist es so (wie es schon gesagt wurde), dass man beim schreiben einer Datei oder Streams (z.B. bei Netzwerktraffic) halt genau sagen muss, was man denn hier schreibt. Bei Dateisystemen war es in der Vergangenheit oft so, dass diese für eine Architektur / ein Betriebssystem geschrieben wurden. Und da wurde dann die Codierung der Architektur beibehalten. So wurde FAT speziell für x86 entwickelt, so dass hier Little-Endian verwendet wurde.
(Wichtig: Dies betrifft jetzt nicht Bytes, die in eine Datei geschrieben wurden sondern das Speichern von Werten innerhalb des Filesystems selbst (Siehe https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system wenn der Aufbau des FAT Filesystems von Interesse ist!).

Diese historische Einschränkung gibt es aber nicht mehr. Es ist üblich, dass Dateisysteme Plattformübergreifend genutzt werde können. Daten werden auch Plattformübergreifend zwischen Geräten ausgetauscht (Netzwerk). Es ist üblich, hier Big-Endian zu nutzen. Aber das ist schlicht etwas, das "üblich" ist. Prinzipiell kann heutzutage natürlich jemand immer noch Daten so versenden oder speichern, wie er es für richtig hält.

==> Damit sind wir bei dem Thema Dateiformat oder Protokoll, mit dem Daten versendet / empfangen werden, was beliebig sein kann und was natürlich dokumentiert werden sollte.

Weitere Links:
- https://de.wikipedia.org/wiki/Byte-Reihenfolge
- https://www.quora.com/Why-is-Network-Byte-Order-Big-Endian
 

Zurück
Oben