[API] Byte-Reihenfolge

Kovu

Stammgast
Ich schreibe privat und für's Geschäft Programme (Web- und GUI, mit PHP und PHP-GTK), bin aber kein Mann vom Fach, bitte entschuldigt wenn folgende Frage etwas dumm erscheint ;)

Ich beschäftige mich zur Zeit mit dem Speichern von Dateien in binärer Form. Primär um ein Dateiformat zu erzeugen das nicht gleich von jedem gelesen und manipuliert werden kann.

Was ich noch nicht ganz Verstehe ist in welchem Zusammenhang die Byte-Reihenfolge (big endian, little endian) in einer Datei mit der Hardware stehen soll.

Es leuchtet mir zwar ein dass Geräte, Prozessoren und Netzwerke die Bytes in der korrekten Reihenfolge übertragen müssen, kann mir aber nicht vorstellen inwiefern dies einen Einfluss auf ein von mir erzeugtes Dateiformat hat. Technisch betrachtet hängt es meiner Meinung nach doch nur von meinem Programm ab in welcher Reihenfolge ich die Bytes ablege und wieder auslese, unabhängig davon ob ich mich auf einem Big-Endian-System oder Little-Endian-System befinde... oder liege ich da falsch?
 

nokhu

Stammgast
Du siehst das richtig. Wenn nur deine selber erstellten Programme die Daten verarbeiten, ist es egal wie die Bits und Bytes zusammengeweurfelt sind. Einfach die Kommentare und die Dokumentation im Sourcecode nicht vergessen sonst sucht man sich nach 3 Jahren tot.

nokhu
 

Kovu

Stammgast
Danke für die schnelle Bestätigung, nokhu :)

Rein aus Interesse, aus welchen Gründen werden dann gewisse Dateiformate an die Byte-Reihenfolge der Systeme gebunden? Ist im Bezug auf Crossplatform-Kompatibilität ja ein Problem, sofern die fremde Reihenfolge nicht bekannt ist und nicht gewandelt werden kann.

Im Normalfall muss die Datei doch ohnehin mit einem Programm geöffnet werden, dem das Format bekannt ist?
 

nokhu

Stammgast
Das ist halt so. Es gibt soviele verschiedene Systeme und Programmierer, dass nicht alles gleich gemacht wird. Wenn eine Datei genau so gespeichert wird wie sie erstellt wurde, kann man diese blockweise lesen und es stimmt immer. Wird etwas umgedreht beim speichern, muss beim Lesen auch wieder umgedreht werden, jedes Byte einzeln. Und schlussendlich entscheidet dies dann, ob eine Software das Datenformat lesen, bearbeiten und speichern kann, oder eben nicht. Wie das so ist auf dem Windows-PC mit Fremdformaten vom Mac oder Linux, es geht nicht immer alles.

nokhu
 

Kovu

Stammgast
Nein, ich meine damit nicht, dass unterschiedlich gearbeitet wird.

Grundsätzlich ist es doch so, dass Endianness vom Prozessortyp abhängt. Little-Endian kommt beispielsweise unter X86 von Intel zur Anwendung, während Big-Endian unter PowerPC üblich ist.

Das Betriebssystem richtet sich, zumindest soweit ich weis, danach aus. Was mir nicht klar ist, ist weswegen man Dateiformate daran bindet. Wenn es doch keine Rolle spielt wie man schreibt und ausliest, macht eine solche Bindung keinen Sinn.

Da in der Computerwelt aber nichts ohne rationalen Grund geschieht, bin ich geneigt in Erfahrung zu bringen weswegen man das macht. ;)
 

M.Ä.N.E

Stammgast
Also wenn ich das Richtig verstanden haben, bezieht sich die Little/big Endian nur auf die Byte Reihenfolge im Arbeitsspeicher. Aber ich glaube es liegt damit zusammen das binäre format nur mit systemspezifischen funktionen/methoden erzeugt werden.Sprich die Daten werden beim binären schreiben so in den Filestream geschrieben wie sie im Arbeitsspeicher vorliegen und dies ist nunmal systemabhängig(Big/little). Und daher kommt das man die Endiane an das Dateiformat bindet. Das heisst nicht das man das Format nicht auf einer anderen Plattform nicht benutzen kann. Wenn du ein portables Datei Format willst würde ich dir empfehlen es wie bei der Netzwerktechnik zu machen. Sich auf ein Rheinfolge einigen, im iNet wäre das die "Network Byte Order"(Big Endian).
Dass heisst du speicherst in BigEndian und fügst deiner lese methode/funktion eine überprüfung hinzu ob das aktuelle System little oder Big Endian ist und konvertierst allenfalls um. Es gibt schon forgefertigte mehtoden für konvertirung von "Network Byte Order" in "Host Byte Order" die dir die Überprüfung abnehmen und du so den Code Plattform unabhängig machen kannst.
Ich hoffe ich habe dich mit Network- und Host Byte Order nicht verwirt. Ich wollte nur zeigen wie das problem bei netzwerken gelöst wurde und wie du sie zweckentfremdet nutzen kannst.
 
Zuletzt bearbeitet:
Oben