Dateien

Zusammenfassung

Eine Datei ist nichts als eine Folge von Bytes. Was sie bedeutet, steht nicht in den Bytes, sondern in einer Vereinbarung über ihren Aufbau: Ein Kopf am Anfang sagt, wie der Rest zu lesen ist, danach kommen die eigentlichen Daten, Byte für Byte. Wer diesen Aufbau kennt, kann jede Datei mit bloßem Auge lesen, und wer ihn nicht kennt, sieht Unsinn. Gespeichert werden die Bytes auf Bausteinen, die sich einen Zustand merken, vom Flip-Flop im Arbeitsspeicher bis zur Magnetisierung auf der Festplatte.

Fragen, um die es geht

  • Was steht in einer Datei, wenn man sie nicht mit dem Programm öffnet, für das sie gedacht ist?
  • Wozu braucht eine Datei einen Kopf, und was steht darin?
  • Wie findet ein Programm in einer Bilddatei das Pixel links oben?
  • Woran erkennt ein Programm, welche Art von Datei es vor sich hat?
  • Wo wohnen die Bytes, wenn der Rechner aus ist, und wo, wenn er läuft?

Dieses Konzept braucht ihr in Challenge 4, wo zum ersten Mal eine ganze Datei durch die Luft geht und der Empfänger sie am Ende öffnen muss.

Erläuterung des Konzepts

Öffnet man eine Bilddatei im Texteditor, erscheint Unsinn: Der Editor liest jedes Byte als Zeichen. Öffnet man dieselbe Datei in einem Hex-Editor, erscheint etwas Nüchternes und sehr Lesbares: die Bytes selbst, eines nach dem anderen, als zweistellige Hexzahlen. Ein Hex-Editor zeigt keine Deutung, nur den Inhalt. Und in diesem Inhalt lässt sich, wenn man den Aufbau kennt, alles wiederfinden: wie groß das Bild ist, wo die Pixel anfangen, welche Farbe das erste hat.

Eine Datei ist eine Folge von Bytes

Das ist die ganze Definition, und sie gilt für jede Datei: Text, Bild, Ton, Programm. Ein Byte hat einen Wert von 0 bis 255, eine Datei hat eine Länge, und die Bytes stehen in einer festen Reihenfolge. Es gibt keine Bilder auf der Festplatte und keine Texte, es gibt nur Bytes, und die Bedeutung entsteht erst beim Lesen. Das habt ihr in Codesysteme und Information und ihr Träger schon gesehen; hier geht es darum, wie eine Datei ihre eigene Lesevorschrift mitliefert.

Das kleinstmögliche brauchbare Beispiel ist eine Bitmap mit vier mal zwei Pixeln, 78 Bytes lang. So sieht sie im Hex-Editor aus; links die Position des ersten Bytes der Zeile, ebenfalls hexadezimal:

0000  42 4d 4e 00 00 00 00 00 00 00 36 00 00 00 28 00
0010  00 00 04 00 00 00 02 00 00 00 01 00 18 00 00 00
0020  00 00 18 00 00 00 c4 0e 00 00 c4 0e 00 00 00 00
0030  00 00 00 00 00 00 00 00 00 00 ff ff ff ff 00 ff
0040  00 ff 00 00 ff 00 ff 00 ff 00 00 ff ff ff
Abbildung 1: Der Aufbau derselben 78 Bytes: ein Dateikopf von 14 Bytes, ein Infokopf von 40 Bytes, dann die Pixel. Die Felder im Kopf sagen dem Programm, wo die Pixel beginnen und wie sie zu lesen sind.

Der Kopf sagt, wie der Rest zu lesen ist

Die ersten beiden Bytes sind 42 4d, als ASCII gelesen „BM”. Das ist die Kennung des Bitmap-Formats: Ein Programm, das eine Datei öffnet, schaut zuerst hierhin. Dann folgt in vier Bytes die Größe der ganzen Datei, 4e 00 00 00, also 78. Dass die 78 vorn steht und die Nullen dahinter, ist eine weitere Vereinbarung des Formats: Bei mehrbytigen Zahlen kommt hier das niedrigste Byte zuerst. An Position 10 steht in vier Bytes, wo die Pixel beginnen: 36 00 00 00, also bei Byte 54. Alles davor ist Kopf.

Der zweite Teil des Kopfs, der Infokopf, beginnt bei Byte 14 mit seiner eigenen Länge (28 00 00 00, 40 Bytes) und enthält, was das Programm zum Zeichnen braucht: die Breite 04 00 00 00, die Höhe 02 00 00 00, und bei Byte 28 die Farbtiefe 18 00, also 24 Bit je Pixel, drei Bytes. Damit weiß das Programm, ohne ein einziges Pixel gesehen zu haben, dass ab Byte 54 genau 4 mal 2 mal 3 gleich 24 Bytes Bilddaten folgen, und genau so lang ist der Rest der Datei. Die Kopffelder sind für das Programm, was das Typfeld und das Längenfeld im Rahmen von Challenge 4 für euren Empfänger sind: die Ansage, was kommt und wie es zu lesen ist.

Die Nutzdaten: Pixel für Pixel

Ab Byte 54 kommen die Pixel, drei Bytes je Pixel. Das erste Pixel ist 00 00 00, schwarz; das zweite 00 ff ff. Wer jetzt „Cyan” sagt, weil Rot aus, Grün und Blau an, liegt daneben, denn dieses Format speichert die drei Anteile in der Reihenfolge Blau, Grün, Rot. 00 ff ff ist Blau aus, Grün an, Rot an: Gelb. Und die erste gespeicherte Zeile ist nicht die obere, sondern die untere; Bitmaps stehen kopfüber in der Datei. Die obere Bildzeile beginnt erst bei Byte 66 mit 00 00 ff, einem reinen Rot.

Beides sind willkürliche Entscheidungen von Leuten, die das Format vor vierzig Jahren festgelegt haben. Sie sind trotzdem verbindlich, weil jedes Programm, das Bitmaps liest, sie kennt und befolgt. Genau das ist ein Dateiformat: kein Naturgesetz, sondern eine aufgeschriebene Vereinbarung, die sich niemand mehr aussuchen kann. Ihr habt in Challenge 3 selbst so eine Vereinbarung geschrieben.

Im Demonstrator Inside a File könnt ihr genau das selbst tun: eines der drei bekannten Fotos als kleine Bitmap im Hex-Editor, Klick auf ein Pixel zeigt seine drei Bytes, und jedes Byte lässt sich ändern. Ändert man ein einziges Byte im Pixelteil, ändert sich ein Farbanteil eines Pixels, und das Bild wird trotzdem angezeigt, nur an einer Stelle falsch. Ändert man ein Byte im Kopf, etwa die Breite, zeigt der Bildbetrachter Streifen oder verweigert die Datei. Das ist der Unterschied zwischen Nutzdaten und Kopf: Ein kaputtes Byte in den Daten ist ein kleiner Schaden, ein kaputtes Byte im Kopf ein großer. Deshalb zählt im Finale der Hash über alles, siehe Fehler und Redundanz.

inside a filea real bitmap in a hex editor: header fields underlined, click a pixel to find its three bytes, then change a byte — and watch the picture obey, or the viewer refuse.LiFi Project · concept demos

Dateiendung, Kennbytes, Typfeld

Woran erkennt ein Programm, welche Art von Datei es vor sich hat? Drei Antworten, alle drei sind Etiketten neben oder vor den Daten. Die Dateiendung .bmp steht im Namen, nicht in der Datei; benennt man sie um, ändern sich die Bytes nicht. Die Kennbytes am Anfang, hier „BM”, stehen in der Datei; PNG beginnt mit einer festen Folge von acht Bytes, PDF mit %PDF. Eine Textdatei hat keine Kennbytes, sie beginnt mit ihrem ersten Buchstaben, und deshalb kann kein Programm den Typ zuverlässig raten. Das Typfeld in eurem Rahmen ist die dritte Antwort: Die Klasse legt fest, welche Zahl für welchen Dateityp steht, und der Sender schickt sie mit. Alle drei lösen dasselbe Problem auf dieselbe Weise, denn Daten allein bedeuten nichts.

Wo die Bytes wohnen

Solange der Rechner läuft, liegt die Datei, mit der ihr arbeitet, im Arbeitsspeicher: in Millionen von Flip-Flops, die sich je ein Bit merken, solange Strom fließt (siehe Verarbeitung). Schaltet man aus, ist das weg. Deshalb gibt es den zweiten Speicher, der ohne Strom hält: die Festplatte, die Bits als winzige magnetisierte Bereiche auf einer Scheibe ablegt, oder der Flash-Speicher in SSD und USB-Stick, der Ladung in einem eingeschlossenen Transistor festhält. Speichern heißt immer, einen physikalischen Zustand zu setzen, der von allein bleibt; lesen heißt, ihn abzufragen. Und zwischen diesen Speichern wandert die Datei als das, was sie ist: dieselbe Folge von Bytes.

Folien

Fragen üben

Übungsfragen zu diesem Konzept folgen, sobald der zugehörige Input steht.

Literatur

  • David Macaulay: The Way Things Work Now. Houghton Mifflin Harcourt 2016, Teil 5 „The Digital Domain”, Kapitel „Storing Bits”. Zeigt in Zeichnungen, wie Speicherchips, Flash, Festplatte und Barcode ein Bit festhalten.