Kann xxd verwendet werden, um die binäre Darstellung der Hex-Zahl auszugeben, nicht eine Zeichenfolge?

10

Ich möchte ein rohes Binärpaket aus hex in der Befehlszeile generieren, um ein Protokoll zu testen. Ich hoffe, es ist einfacher, dies so zu tun, als eine Anwendung zu schreiben.

Folgendes passiert derzeit:

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010

Was ich gerne hätte, ist:

echo '0A' | xxd  -b
0000000: 00001010    

oder

echo '0A' | xxd  -b
0000000: 01010000    

Da bin ich mir über die geforderte Endianess nicht sicher. Ich möchte es bei Bedarf ändern können. Ist das erreichbar?

TheMeaningfulEngineer
quelle

Antworten:

9

echo '0A'erzeugt drei Zeichen : 0 A NL; xxd -bdruckt dann diese drei Zeichen in Binärform. Wenn Sie nur das einzelne Byte mit dem Wert 10 (dh hexadezimal A) möchten , können Sie (in Bash) schreiben:

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline

Eine bessere Alternative wäre printf '\x0A'; printf interpretiert Escape-Sequenzen in der Formatzeichenfolge und gibt keine impliziten Zeilenumbrüche aus. (Dies ist die Posix-kompatible Lösung, die auf jeder Posix-kompatiblen Shell funktionieren sollte.) Eine weitere Bash-Möglichkeit ist echo -n -e '\x0A': Das (nicht standardmäßige) -eFlag fordert das Echo auf, Escape-Sequenzen zu interpretieren.

Ich habe keine Ahnung, warum Sie erwarten würden echo '1' | xxd -b, das Äquivalent von hex auszugeben 50. Wie erwarten Sie xxdzu verstehen, dass dies 0Aeine Hex-Zahl ist und 1nicht? Außerdem warum 50? (Der ASCII-Code für das Zeichen 1ist hex 31.)

Endianness wirkt sich nicht auf Bytes aus. Die Reihenfolge der Bits innerhalb eines Bytes ist völlig konzeptionell, bis das Byte über eine serielle Leitung übertragen wird und selbst dann nur mit einem Oszilloskop oder ähnlichem sichtbar ist.

Rici
quelle
Entschuldigung für die 50. Es ist ein Tippfehler. Jetzt
reparieren
7

Wenn Sie die Binärausgabe für eine Folge von Hex-Ziffern wünschen , xxd -r -p. Z.B:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....

konvertiert 0A0B0C0D in vier Bytes Binär (erster Aufruf von xxd) und konvertiert es dann zurück, um druckbar zu sein (zweiter Aufruf). Sie sagen, Sie möchten eine Binärausgabe, aber die Beispiele, die Sie suchen, sind eine druckbare Darstellung.

Ich kenne nichts, bei dem Endianness auf der Knabberebene mehrdeutig ist, wie Sie in Ihrem zweiten Beispiel andeuten. Die Konvertierung in xxd ist jeweils ein reines Byte, ohne dass davon ausgegangen wird, dass sie eine bestimmte Multi-Byte-Zahl darstellen.

jtniehof
quelle
2

Ja, Sie können dies verwenden xxd, aber das Eingabeformat gefällt Ihnen möglicherweise nicht. In Ihrem Beispiel ist 0x0a der Hex-Wert einer ASCII-Newline. Sie können eine Datei mit einem einzelnen Zeilenumbruch xxderstellen und dann die Liste erstellen:

$ xxd one_line_file
0000000: 0a                                       .

Sie können eine einzelne Zeile xxdaus dieser Ausgabe herausholen, wenn Sie ihr die richtigen Flags geben:

$ echo "0000000: 0a" | xxd -r > another_one_line_file
$ xxd another_one_line_file
0000000: 0a 

xxdhat ein ziemlich schönes Ausgabeformat, ich denke nicht, dass es zu lästig wäre, Ihre Pakete mit einem Texteditor zu erstellen und dann zu verwenden xxd -r, um zur Binärdatei zu wechseln. .

Bruce Ediger
quelle