Binärdateien

Dieser Text befasst sich mit dem grundsätzlichen Aufbau von Binärdateien sowie dem Problem der Endianness. Wer dies schon kennt, kann getrost weiter zum Thema Binäre Streams.

Grundsätzliches

Textdateien bestehen aus einer Abfolge von Zeichen, die zu Zeilen zusammengefasst werden. Binärdateien hingegen bestehen einfach aus einer Abfolge von Zahlen. Deren Bedeutung wird erst durch die Formatspezifikation festgelegt, aber es gibt ein paar allgemeingültige Regeln.

Bits und Bytes

Ein Bit ist eine Ziffer, welche nur die Werte 0 oder 1 annehmen kann. 8 Bits ergeben ein Byte. Mit 8 Bit lassen sich 256 verschiedene Kombinationen darstellen. Deswegen wird ein Byte häufig als Zahl im Bereich 0 - 255 dargestellt, bzw 0x00 - 0xFF in Hexadezimalschreibweise. Eine Binärdatei wird zunächst mal immer als Abfolge von Bytes betrachtet.

grosse Zahlen

Oft werden grössere Zahlen als 255 benötigt. In diesem Fall wird die Zahl auf mehrere Bytes aufgeteilt. Am häufigsten sind 32 Bit Zahlen (also 4 Byte) und 16 Bit Zahlen (2 Byte). Die Bytes sind dabei nach „Wertigkeit“ geordnet.

Um aus den Bytes die ursprüngliche Zahl zu rekonstruieren, kann man folgendermassen vorgehen: Zunächst betrachtet man die einzelnen Bytes wie gehabt als Zahlen von 0 - 255. Nun fängt man beim höchstwertigen Byte an, multipliziert den Wert mit 256, und addiert das nächst niederwertige Byte. Bei 16 Bit ist man hier schon fertig. Bei grösseren Zahlen, multipliziert man das Zwischenergebnis mit 256, und addiert wiederum das nächst niederwertige Byte. Dies wiederholt man so lange, bis man das niederwertigste Byte addiert hat.

Beispiele:

Eine 16 Bit Zahl besteht aus einem höherwertigen Byte 16 und einem Niederwertigen Byte 100:

16×256+100 = 5'096

Eine 32 Bit Zahl besteht in absteigender Wertigkeit aus den Bytes 1, 30, 7 und 210:

((1×256+30)×256+7)×256+210 = 18'745'298

welches Ende hättens gern?

Wie gesagt sind bei grossen Zahlen die Bytes nach Wertigkeit geordnet. Aber ob in absteigender oder aufsteigender Reihenfolge, darüber hat sich die Computerindustrie bis heute nicht geeinigt.

Bei aufsteigender Reihenfolge, also mit der kleinsten Wertigkeit zuerst, spricht man von „Little-Endian“. Bei absteigender Reihenfolge, mit der grössten Wertigkeit zuerst, nennt man es „Big-Endian“. Die Begriffe sind eine Anspielung auf die Liliputaner aus Gullivers Reisen, die sich partout nicht darüber einigen können ob ein Ei am spitzen Ende (little end) oder am stumpfen Ende (big end) aufgeschlagen werden soll.

Big-Endian ist auch bekannt als „Network Order“. Dies, weil unter anderem TCP/IP jene Reihenfolge verwendet.

Die von uns verwendeten Formate verwenden fast alle Big-Endian. Ein paar wenige verwenden aber Little-Endian. In den Texten wird jeweils darauf hingewiesen.

negative Zahlen

Bisher haben wir die Zahlen als ausschliesslich positiv (oder 0) betrachtet. Dies nennt man vorzeichenlose Betrachtung. Man kann die Zahlen aber auch als vorzeichenbehaftet betrachten.

Bei vorzeichenbehafteten Zahlen wird die obere Hälfte der möglichen Zahlen als negativ gewertet. Dabei wird vom grösstmöglichen Wert auf den kleinstmöglichen Wert gesprungen. Über den Rest des Zahlenraums steigt der Wert dann wieder auf -1 auf. Weil es kein negatives 0 gibt, ist der Absolutwert der kleinstmöglichen Zahl um 1 grösser als jener der grösstmöglichen Zahl.

Das ganze lässt sich leicht an 8 Bit Zahlen demonstrieren. Betrachten wir die Zahl vorzeichenlos, so steigt der Zahlenraum von 0 bis 255 auf. Betrachten wir sie als vorzeichenbehaftet, so steigt der Zahlenraum erst von 0 bis 127 auf, springt dann auf -128, um schliesslich wieder auf -1 anzusteigen.

Diese Reihenfolge wurde gewählt, weil sie sich technisch besser verarbeiten lässt. Wir selbst müssen uns damit normalerweise nicht herumschlagen: Die Programmiersprache handhabt es für uns. Allerdings müssen wir beim Auslesen der Zahlen wissen, ob sie vorzeichenlos oder vorzeichenbehaftet sind.

Texte

In Binärdateien können auch Texte enthalten sein. Diese sind, wie in Textdateien, direkt in der entsprechenden Zeichenkodierung abgelegt. Allerdings muss man den Ort in der Datei und die Länge des Textes aufgrund des Formats ermitteln.

Meistens ist die Länge des Textes fix vorgegeben, oder durch eine Zahl innerhalb der Datei definiert. Manchmal sind Texte aber auch 0-terminiert. Das heisst, sie gehen so lange, bis man auf ein Zeichen mit dem Code 0 trifft.

Diskussion

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
T M O K S
 
grundlagen/dateien/binaer/start.txt · Zuletzt geändert: 2013/04/22 15:03 (Externe Bearbeitung)
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC0 1.0 Universal
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki