Also.
Zuerst wird die ganze Datei in den Puffer
buf eingelesen.
s ist ein Char-Array, mit 8 Elementen. Jedes Byte hat ja so ungefähr 8 Bits. Die For-Schleife geht dann jedes Byte in der Datei durch und setzt jeweils die 8 Elemente von
s entsprechend den Bits vom aktuellen Byte. Und das ist genau das, was folgende Zeile macht.
Delphi-Quelltext
1:
| s[0] := Chr(Integer((buf[i] and $80) <> 0) + 48); |
$80 sieht in binärer Form so aus: 10000000.
buf[i] and $80 liefert nun 10000000 zurück, wenn in
buf[i] das erste Bit gesetzt ist, ansonsten 00000000. Genauso ist es auch bei den anderen Bits.
$40 ist in binärer Form 01000000.
buf[i] and $80 gibt 01000000 zurück, wenn das zweite Bit gesetzt ist, ansonsten auch wieder 00000000. Dann überprüfe ich jedesmal, ob das Ergebnis nicht 00000000 ist. Denn dann ist das jeweilige Bit gesetzt.
Integer() ist ein sog.
TYPECAST, er wandelt den Wert in der Klammer (hier Boolean) in einen Integer um. Jetzt sieht die Lage so aus: Wenn das jeweilige Bit gesetzt ist, dann bekommen wir den Wert 1, ansonsten den Wert 0, beidemale jedoch als Integer! Diesen Wert addieren wir jetzt zu 48, da das ASCII-Zeichen von 0 genau 48 ist, und von 1 natürlich 49. Mittels
Chr() wandeln wir diesen Wert noch in einen Char um, der dann entweder '0' oder '1' ist. Das ganze geschieht mit allen 8 Bits von jedem Byte. Und dann wird einfach
s, das nun die 8 Nullen oder Einsen enthält, ins Memo geschrieben.