hotti: Binärdateien

Beitrag lesen

hi,

vielleicht noch ein paar ergänzende Worte, was Binärdateien betrifft. Altvater Nicolas Wirth bezeichnet Dateien als Sequenzen. Von "echten" Random-Access-Dateien mal abgesehen, werden Binärdateien auch sequentiell geschrieben und gelesen, wobei nur mit Offset (Position ab Dateibeginn) und Length operiert wird.

Die Angaben Offset und Length sind stets als Anzahl der Bytes zu betrachten (danke dedlfix). Konsequenterweise gibt es in Binärdateien keine textlichen Strukturen wie Delimiter, Boundaries o.ä und es gibt auch keine Zeilenumbrüche im Sinne von Textdateien.

Zum Erzeugen oder Lesen wird ein Algorithmus gebraucht, welcher umkehrbar ist und aus Datenstrukturen (Arrays, Hashes, Objects...) diese Binärsequenzen erzeugt und auch wieder lesen kann. Ein besonderes Augenmerk gilt dabei den Längenangaben, genau an dieser Stelle setzt die pack()-Funktion an:

Mit einer geeigneten (Byte)Schablone werden aus Zahlen die Längenangaben in Bytesequenzen (Teile einer Binärdatei) gepackt, die _immer_ eine konstante Anzahl von Bytes haben. So wird aus einem 32-Bit-Integer mit pack("N", $i) eine Bytefolge von genau 4 Bytes erzeugt.

Der Algorithmus umschreibt den Vorgang der Serialisierung und Deserialize. Am einfachsten sind Arrays zu serialisieren, Algorithmus Beispiel:

0 lege eine Schleife um jedes Array-Element, Schleifenkörper:
1 bestimme die Länge eines Elements
2 schreibe die Länge mit pack("N", $length) in die Sequenz (4 bytes)
3 schreibe die Bytes des Array-Elements in die Sequenz (x bytes)
<-- Loop

Dieser Algorithmus lässt sich umkehren, zum Lesen wird ein Handler aufgemacht und aus dem Handler werden die Bytes gelesen wie folgt:

1 Lese 4 bytes, unpack("N", $bytes) ergibt die Länge des nachfolgenden Array-Elements
2 Lese das Array-Element
3 Lese wieder 4 bytes ... loop bis EOF

Das war einfach ;)
Gute Übung für lange Winterabende...

Freilich gibt es weitere Algorithmen, die nicht so einfach sind. So richtig kompliziert wird es mit komplexen Datenstrukturen, die rekursiv durchlaufen werden müssen.

Binaries sind plattformunabhängig, es ist jedoch zu beachten, dass gewisse OS'se beim Öffnen eines Descriptors mitgeteilt bekommen wollen, dass es eine Binärdatei ist.

Durch die Vielzahl möglicher Algorithmen bedingt, ist der Datenaustausch auf einen engen Anwendungskreis beschränkt, für einen anwendungsunabhängigen Datenaustausch hingegen konnten sich Binärfomate bisher nicht durchsetzen. Ein solcher ist nur dann möglich, wenn den beteiligten Programmen/Partnern der Algorithmus nicht nur bekannt sondern auch anwendbar ist.

Es liegt jedoch auf der Hand, das Binaries sehr schlank sind und bis auf die Längenangaben gibt es kaum "Tara" im Gegensatz zu XML wo alleine für die Tags schonmal einige Megabyte zusammenkommen können ;)

Binaries sind von daher auch nicht nur als Dateien sondern auch für Datenfernübertragungen bestens geeignet.

O'Hotti