Ich wäre froh um jede beantwortete Frage…
Dann nehme ich die zweite
2.) BINÄR SCHREIBEN:::
Wie schreibe ich einen Binärkod (z.B. 100011010…) in eine
Datei? Strings, oder Integerwerte kann man problemlos mit
Write(F1, Ch)
schreiben
Dein „Binärer Code“ ist letztlich nix anderes als eine Folge von zwei möglichen Zuständen Aus/An, Ja/Nein, wahr/falsch, weiss/schwarz, 0/1. Die Zustände stellen jeweils ein Bit dar, eben 0 oder 1.
Nun kannst Du diese Zustände nehmen und in eine Datei schreiben:
Bit Nr. 1 kommt an -> 0
ch := 0; write (F, ch);
Du verschwendest dann aber 7 von 8 möglichen Bits (bei char) und 15 von 16 bei Word, Integer …
… wie geht es aber wenn ich
einen längeren Binärkod schreiben will?
Wie lang?
Als erstes gruppierst Du die Bit-Folgen in Pakete. Du mußt wissen, wie lang die längste Bit-Folge sein wird, danach richtet sich die Paketgröße. Bei seeeehr langen Bit-Folgen mußt Du die Bit-Folge in mehrere kleine Pakete splitten und diese in einen Container verfrachten, wiederum mit der Aussicht auf Platzverschwendung.
Konvertiere also Bit-Folgen in ein Zahlensystem Deiner Wahl und schreibe das Ergebnis in eine Datei, z.B. 8 Bits:
Bit Nr. 1 bis 8 kommen an -> „11111111“ (= 256 dec, = FF hex)
ch := 256; write (F, ch);
Wie kommen Deine Bits an, seriell … ?
incoming -> „…10011010“
Hier kommen Deine Zustände bitweise, lose, so nach und nach (seriell) und ohne Ordnung, wie z.B. von einer Meßreihe, an. Das rechte Bit ist das allererste, älteste.
…oder parallel (als fertiges, mehrbittiges Paket) …?
„10011010“
Auf den ersten Blick ist zwischen seriell/parallel kein Unterschied.
Auf den zweiten Blick siehst Du aber, das bei dem „parallelen Paket“ nicht erkennbar ist, welches Bit das „erste“ ist, also ob der erste Bit-Wert die 0 oder die 1 ist.
Wenn 0 dann ist „10011010“ = 154 decimal
Wenn 1 dann ist „01011001“ = 89 decimal
Das niederwertigste Bit steht eigentlich, menschlich lesbar notiert, immer rechts. Aber Deine Datenquelle ist sicher kein Mensch und kann da anderer Meinung sein.
Du musst das vorher wissen, denn es wird beim Auswerten der Daten von Bedeutung sein: Die Reihenfolge der Bits in den Paketen Deiner Datei ist nicht zwingend die Reihenfolge ihres Eintreffens. Und je größer Du die Pakete machst, desto konfuser wird es. Aber das merkst Du spätestens dann, wenn Du einen definierten Bit-Stream aus der Datei rekonstruieren willst
Dann gibts da noch die Reihenfolge zu beachten wenn ein Paket mehr als 8 Bit speichert, denn bei 2 Byte (16 Bit) was z.B. einem Word (oder Integer) entspricht - welches Byte davon soll das höherwertige sein also an welcher Stelle in der Datei stehen …
Beispiel
Wenn Du den Wert 1A9E hex (=6814 dez.) in eine leere, binäre Datei schreibst, ist diese Datei anschließend 2 Bytes groß. An welcher Stelle der Datei steht aber das höherwertige Byte? Betrachte sie mit einem Hex-Viewer:
steht da „1A 9E“ oder „9E 1A“ ?
Dazu bemühe mal Google und suche nach „big-endian“ bzw. „little-endian“. Intel Systeme speichern im „Little-Endian-Format“. Entspricht das Deiner gewünschten Byte-Folge und der daraus resultierenden Bit-Folge?
Das Zahlensystem für Deine Pakete sollte natürlich das Hexadezimale sein, denn damit lassen sich vortrefflich binäre Werte speichern und alle Computer tun das ohnehin, weil es am effektivsten ist. Dezimale Werte verschwenden Platz.
Als Variante, könnte man z.B. 8 Bits zu einem Char
zusammenfassen??
Klar. Ein Char besteht aus 8 Bits und das ist eigentlich ein Byte. Du kannst die Bit-Folge aber auch in einen String, Record, Array oder sonstwas packen.
Viel sinnvoller sind natürlich Byte, Word, Int, LongInt oder Arrays davon, weil Du früher oder später auf logische Operationen treffen wirst und Dir Typ-Umwandlungen ersparst.
Dem Computer ist es letztlich egal, wie Du es nennst. Es sind immer wieder nur Nullen und Einsen - auf die Reihenfolge kommt es an
gruss - lexa