Wie binäre Nachrichtenformate analysieren / codieren?

7

Ich muss analysieren und zu einem traditionellen binären Nachrichtenformat in Java kodieren. Ich begann mit DataOutputStream, um primitive Typen zu lesen / schreiben, aber das Problem, das ich habe, ist, dass das Nachrichtenformat nicht gut mit Byte-Offsets übereinstimmt und Bit-Flags enthält.

Zum Beispiel muss ich mit solchen Nachrichten umgehen:

%Vor%

Wobei (b) ein Ein-Bit-Flag ist. Das Problem ist, dass Java-Primitivtypen nicht an Bytegrenzen ausgerichtet sind, so dass ich DataOutputStream nicht zum Codieren verwenden könnte, da der Typ mit der niedrigsten Stufe, den ich schreiben kann, ein Byte ist.

Gibt es Bibliotheken, Standard oder Drittanbieter, die mit beliebigen Nachrichtenformaten auf Bit-Ebene umgehen können?

Bearbeiten: Danke an @Software Monkey, dass er mich gezwungen hat, meine Spezifikationen genauer zu betrachten. Die Spezifikation, die ich verwende, ist tatsächlich auf Byte-Grenzen ausgerichtet, so dass DataOutputStream geeignet ist. Angesichts meiner ursprünglichen Frage wäre ich jedoch mit der von @emboss vorgeschlagenen Lösung gegangen.

Bearbeiten: Obwohl das Nachrichtenformat für diese Frage auf Bytegrenzen gefunden wurde, bin ich auf ein anderes Nachrichtenformat gestoßen, das auf die ursprüngliche Frage anwendbar ist. Dieses Format definiert eine 6-Bit-Zeichenzuordnung, bei der jedes Zeichen tatsächlich nur 6 Bits und nicht das vollständige Byte benötigt, so dass Zeichenfolgen nicht an Bytegrenzen ausgerichtet sind. Ich habe mehrere binäre Ausgabeströme entdeckt, die dieses Problem angehen. Wie dieser: Ссылка

    
kenen 28.07.2011, 17:08
quelle

5 Antworten

5

Es gibt einen eingebauten byte -Typ in Java, und Sie können in byte[] buffers einfach mit InputStream # read (byte []) und schreibe in einen OutputStream mit OutputStream # write (byte [], int, int) Das ist also kein Problem.

In Bezug auf Ihre Nachrichten - wie Sie richtig bemerkt haben, ist das kleinste bisschen Information, die Sie auf einmal bekommen, ein Byte, also müssen Sie zuerst Ihr Nachrichtenformat in 8-Bit-Stücke zerlegen:

Nehmen wir an, Ihre Nachricht befindet sich in einem byte [] namens data. Ich nehme auch Little-Endianness an.

Ein uint32 ist 32 Bits lang - & gt; das sind vier Bytes. (Seien Sie vorsichtig, wenn Sie dies in Java parsen, Java-Ganzzahlen und Longs werden signiert, Sie müssen damit umgehen. Eine einfache Möglichkeit, Schwierigkeiten zu vermeiden, wäre die Länge. Data [0] füllt die Bits 31-24, data [1] 23 - 16, data [2] bits 15 - 8 und data [3] bits 7 bis 0. Also müssen Sie sie entsprechend nach links verschieben und mit logischem ODER zusammenkleben:

%Vor%

Als nächstes gibt es zwei einzelne Bits. Ich nehme an, Sie müssen prüfen, ob sie "ein" (1) oder "aus" (0) sind. Dazu verwenden Sie Bitmasken und vergleichen Ihr Byte mit dem logischen UND.

Erstes Bit: (binäre Maske | 1 0 0 0 0 0 0 0 | = 128 = 0x80)

%Vor%

Zweites Bit: (binäre Maske | 0 1 0 0 0 0 0 0 | = 64 = 0x40)

%Vor%

Um den nächsten uint32 zu erstellen, müssen Sie Bytes über Bytegrenzen der zugrunde liegenden Daten schreiben. Z.B. für das erste Byte nimm die restlichen 6 Datenbits [4], verschiebe sie zwei nach links (sie werden Bit 8 bis 2 des uint32 sein) und "füge" die ersten (höchsten) zwei Daten [5] durch Verschieben hinzu sie 6 Bits nach rechts (sie werden die restlichen 1 und 0-Slot der Uint32 nehmen). "Hinzufügen" bedeutet logisch ODER-Verknüpfung:

%Vor%

Das Erstellen Ihrer uint32 erfolgt dann genauso wie im ersten Beispiel. Und so weiter und so fort.

    
emboss 28.07.2011, 17:51
quelle
4

Ich habe nette Dinge über Preon gehört.

    
pholser 28.07.2011 17:15
quelle
4

Um die Antwort von pholser hinzuzufügen, denke ich, dass die Preon-Version etwa so aussehen würde:

%Vor%

... aber in Wirklichkeit können Sie Ihr Leben noch einfacher machen, indem Sie Preons Unterstützung nutzen mit Aufzählungen direkt umgehen .

Ein Codec dafür erstellen und es zum Dekodieren einiger Daten verwenden, wäre etwa so:

%Vor%     
Wilfred Springer 19.08.2011 07:03
quelle
4

Mit dem Java-Binärblock-Parser wird das Skript zum Analysieren der Nachricht

sein %Vor%     
Igor Maznitsa 29.03.2015 17:46
quelle
2

Sie müssen Bit-Arithmetik (AND-, OR- und NOT-Operatoren) anwenden. um einzelne Bits innerhalb eines Bytes in Java zu ändern oder zu lesen. Arithmetische Operatoren sind & amp ;, | und ~

    
quelle

Tags und Links