Ich habe das nun mit
Narses Hilfe gelöst bekommen! =) Nicht durch den Post, sondern mit Hilfe seines Binär-Protokolls
Der Funktion
AddBits() übergebe ich den ByteArray und die momentane Länge dieses Arrays in
Bits. Dazu noch die Bitfolge und die Länge dieser Bitfolge:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure AddBits( var ByteArray: String; var ArrLen: Longword; Bits: Longword; Size: Longword ); begin Bits := Bits SHL ( 32 - Size ); Bits := Bits SHR ( ArrLen MOD 8 );
Bits := ( (Bits SHR 24) AND $FF ) OR ( (Bits SHR 8) AND $FF00 ) OR ( (Bits SHL 8) AND $FF0000 ) OR ( (Bits SHL 24) AND $FF000000 );
SetLength( ByteArray, 1 + ( ArrLen + Size ) div 8 ); PLongword( @ByteArray[1 + ArrLen div 8] )^ := PLongword( @ByteArray[1 + ArrLen div 8] )^ OR Bits;
ArrLen := ArrLen + Size; end; |
Die Erklärung dieser Funktion:
- Zeile 3: Ich schiebe die Bitfolge ans Ende des Longwords, sodass die Bitfolge von Links nach Rechts gelesen am Anfang steht.
- Zeile 4: Danach schiebe ich die Bitfolge um die Anzahl an Bits nach Links, die bereits in dem letzten Byte gesetzt sind.
- Die Zeile 3 und 4 kann und wird noch zusammengefasst!
- Zeile 6 & 7: Die vier Byte Blöcke des Longwords tauschen die Reihenfolge. Grund: Bei der Speicherung über den Pointer (Zeile 10) wird der Longword in umgekehrter Reihenfolge gespeichert.
- Zeile 9: Neue Länge des ByteArrays.
- Zeile 10: Das Anfügen der Bitfolge an den String (An dieser Stelle verwende ich den Auszug aus dem Bitär-Protokoll von
Narses! Vielen Dank!
)
Diese Funktion hat leider nur einen Nachteil, den cih noch nicht behoben bekomme: Wenn ich ein Byte genau fülle, dann wird ein weiteres Null-Byte angefügt! Das werde ich auf jeden Fall noch beheben!
Um die Werte aus dem Beispiel aus dem Ersten Post an einen ByteArray zu hängen, muss man folgenden Quelltext schreiben:
Delphi-Quelltext
1: 2: 3: 4:
| AddBits( ByteArray, BitLength, $43, 7 ); AddBits( ByteArray, BitLength, $07, 7 ); AddBits( ByteArray, BitLength, $66, 7 ); AddBits( ByteArray, BitLength, $01, 7 ); |
Gibt man das ganze nach jedem Schritt als HexDump aus, erhält man folgende Ausagben:
Quelltext
1: 2: 3: 4:
| 86 86 1C 86 1F 30 86 1F 30 10 |
Das ganze kann man unten auch auf Richtigkeit prüfen (sofern man Bits in Hex umrechnen kann

)!
Ich habe das ganze mal so ausführlich gemacht, weil eventuell auch mal andere eine solche Funktion benötigen!
Grüße, Sirke