Xxd può essere usato per generare la rappresentazione binaria di un numero esadecimale, non una stringa?


10

Vorrei generare un pacchetto binario grezzo da hex nella riga di comando allo scopo di testare un protocollo. Spero sia più semplice farlo in questo modo che scrivere un'aplicazione.

Ecco cosa succede attualmente:

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

Quello che vorrei avere è:

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

o

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

Dal momento che non sono sicuro della endianess richiesta. Vorrei essere in grado di cambiarlo quando necessario. Questo è realizzabile?

Risposte:


9

echo '0A'produce tre caratteri 0 A NL:; xxd -bpoi stampa quei tre caratteri in binario. Se volessi solo il singolo byte il cui valore è 10 (esadecimale A), potresti scrivere (in bash):

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

Un'alternativa migliore sarebbe printf '\x0A'; printf interpreta le sequenze di escape nella stringa di formato e non genera nuove righe implicite. (Questa è la soluzione compatibile con Posix, che dovrebbe funzionare su qualsiasi shell compatibile con Posix.) Un'altra possibilità è bash echo -n -e '\x0A'; il -eflag (non standard) chiede all'eco di interpretare le sequenze di escape.

echo '1' | xxd -bnon produrrà l'equivalente di hex 50, perché xxdnon sa che 0Aè un numero esadecimale e 1non lo è. Inoltre, il codice ascii per il personaggio 1è hex 31, no 50.

L'endianness non influenza i byte. L'ordine dei bit all'interno di un byte è del tutto concettuale fino a quando il byte non viene trasmesso su una linea seriale e anche allora è visibile solo con un oscilloscopio o qualcosa di simile.


Mi dispiace per il 50. È un errore di battitura.
Risolvendolo

7

Se si desidera che l'uscita binaria per una stringa di cifre esadecimali, xxd -r -p. Per esempio:

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

converte 0A0B0C0D in quattro byte di binario (prima chiamata in xxd), quindi lo converte nuovamente in stampabile (seconda chiamata). Dici di volere un output binario, ma gli esempi che stai cercando sono una rappresentazione stampabile.

Non conosco nulla in cui l'endianità sia ambigua a livello di stuzzichini, come insinui nel tuo secondo esempio. La conversione in xxd è un byte puro alla volta, non assumendo che rappresentino un particolare numero multi-byte.


2

Sì, puoi usarlo xxdper farlo, ma potrebbe non piacerti il ​​formato di input. Dal tuo esempio, 0x0a è il valore esadecimale di una nuova riga ASCII. È possibile creare un file con una sola nuova riga al suo interno, quindi utilizzare xxdper creare l'elenco:

$ xxd one_line_file
0000000: 0a                                       .

Puoi ottenere una nuova riga xxdda quell'output se gli dai i flag corretti:

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

xxdha un formato di output piuttosto carino, non penso che sarebbe troppo oneroso creare i tuoi pacchetti usando un editor di testo, quindi usare xxd -rper andare in binario. .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.