Codierung einer Ganzzahl im 7-Bit-Format von C # BinaryReader.ReadString

8

C# s BinaryReader hat eine Funktion, die laut MSDN eine Ganzzahl liest, die als "Integer mit sieben Bit" codiert ist, und liest dann eine Zeichenfolge mit der Länge dieser Ganzzahl.

Gibt es eine klare Dokumentation für das Integer-Format mit sieben Bit (ich verstehe grob, dass das MSB oder das LSB angibt, ob mehr Bytes zu lesen sind, und die restlichen Bits die Daten sind, aber ich werde mich freuen etwas genauer).

Noch besser, gibt es eine C Implementierung zum Lesen und Schreiben von Zahlen in diesem Format?

    
Elazar Leibovich 11.10.2009, 12:11
quelle

5 Antworten

10

Nun, die Dokumentation für BinaryReader.Read7BitEncodedInt sagt bereits, dass es erwartet, dass der Wert mit BinaryWriter.Write7BitEncodedInt geschrieben wird und dass Methodendokumentation beschreibt das Format:

  

Die Ganzzahl des Wertparameters wird sieben Bits gleichzeitig ausgeschrieben, beginnend mit den sieben niedrigstwertigen Bits. Das High-Bit eines Bytes gibt an, ob nach diesem Byte mehr Bytes geschrieben werden müssen.

     

Wenn der Wert in sieben Bits passt, benötigt er nur ein Byte Speicherplatz. Wenn der Wert nicht in sieben Bits passt, wird das High-Bit auf das erste Byte gesetzt und ausgeschrieben. Der Wert wird dann um sieben Bits verschoben, und das nächste Byte wird geschrieben. Dieser Vorgang wird wiederholt, bis die ganze Zahl geschrieben wurde.

So wird die Ganzzahl 1259551277 in der Binärzahl 1001011000100110011101000101101 wie folgt in das 7-Bit-Format konvertiert:

%Vor%

Ich bin jedoch nicht so zuversichtlich in meinen C-Fähigkeiten, um eine funktionierende Implementierung zu bieten. Aber es ist nicht sehr schwer zu tun, basierend auf dieser Beschreibung.

    
Joey 11.10.2009, 12:16
quelle
4

Ich musste dieses 7-Bit-Format auch erkunden. In einem meiner Projekte packe ich einige Daten in Dateien mit C # 's BinaryWriter und entpacke sie dann erneut mit BinaryReader, was gut funktioniert.

Später musste ich einen Reader für die gepackten Dateien dieses Projekts auch für Java implementieren. Java hat eine Klasse namens DataInputStream (in java.io package), die einige ähnliche Methoden hat. Leider unterscheidet sich die Dateninterpretation von DataInputStream stark von C #.

Um mein Problem zu lösen, portierte ich C # 's BinaryReader selbst in Java, indem ich eine Klasse schreibe, die java.io.DataInputStream erweitert. Hier ist die Methode, die ich geschrieben habe, die genauso funktioniert wie C # 's BinaryReader.readString ():

%Vor%     
Alex B. 17.05.2011 00:08
quelle
2

Write7BitEncodedInt-Methode enthält die Beschreibung: Die niedrigsten 7 Bits jedes Bytes codieren die nächsten 7 Bits der Zahl. Das höchste Bit wird gesetzt, wenn ein weiteres Byte folgt.

    
Christian Schwarz 11.10.2009 12:18
quelle
2

Das Format wird hier beschrieben: Ссылка

    
logicnp 11.10.2009 12:18
quelle
2
%Vor%     
Telc 29.07.2011 09:51
quelle

Tags und Links