2012-10-31 10 views
18

Ho un sacco di questo tipo di stringa e voglio trovare un comando per convertirlo in ascii, ho provato con echo -e e od, ma non ha funzionato.Conversione stringa esadecimale in ascii in bash riga di comando

0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 
+0

Questo non sembra ASCII. ASCII non è definito per valori maggiori di 0x7f. –

+0

vuoi dire che è binario? – Kerby82

+0

Intendi int/binary invece di ASCII? I valori che hai mostrato sono superiori all'intervallo ASCII ... –

risposta

12

Questo codice converte il testo 0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2 in un flusso di 11 byte con valori equivalenti. Questi byte saranno scritti allo standard.

TESTDATA=$(echo '0xA7.0x9B.0x46.0x8D.0x1E.0x52.0xA7.0x9B.0x7B.0x31.0xD2' | tr '.' ' ') 
for c in $TESTDATA; do 
    echo $c | xxd -r 
done 

Come altri hanno fatto notare, questo non si tradurrà in una stringa ASCII stampabile per il semplice fatto che i byte specificati non sono ASCII. È necessario pubblicare ulteriori informazioni su come hai ottenuto questa stringa per consentirci di aiutarti.

Come funziona: xxd -r traduce i dati esadecimali in binario (come un dump esadecimale inverso). xxd richiede che ogni riga inizi con il numero indice del primo carattere sulla linea (esegui hexdump su qualcosa e vedi come ogni riga inizia con un numero indice). Nel nostro caso vogliamo che il numero sia sempre zero, poiché ogni esecuzione ha solo una linea. Per fortuna, i nostri dati hanno già zero prima di ogni carattere come parte della notazione 0x. La lettera minuscola x è ignorata da xxd, quindi tutto ciò che dobbiamo fare è inviare ogni carattere 0xhh a xxd e lasciare che faccia il lavoro.

Il tr traduce i periodi in spazi in modo che per dividerli correttamente.

+0

non funziona per me con xxd --version = 'xxd V1.10 27oct98' su newish Redhat linux (con ksh). Ho solo un § char. – shellter

+0

Questo è esattamente ciò che ottengo anch'io. I dati non sono di testo, quindi non vengono stampati molto bene. Per vederlo in una forma stampabile, inserisci il mio codice in una funzione bash, come danstest() {...}. Quindi, chiama la funzione e invia l'output a hexdump -C. Questo ti mostrerà byte per byte quali dati stanno uscendo dal mio codice. –

+1

cool. Puoi semplicemente fare '... fatto | hexdump -C', nessuna funzione necessaria. Buona fortuna a tutti. – shellter

1

Il echo -e deve aver avuto esito negativo a causa dell'errore di escape. Il seguente codice funziona bene per me su un'uscita simile da your_program with arguments:

echo -e $(your_program with arguments | sed -e 's/0x\(..\)\.\?/\\x\1/g') 

Si prega di notare, tuttavia, che il vostro hexstring originale è composto da caratteri non stampabili.

57

Questo ha funzionato per me.

$ echo 54657374696e672031203220330 | xxd -r -p 
Testing 1 2 3$ 

-r dice di convertire esadecimale per ASCII come opposto al suo normale modo di fare il contrario

-p dice di usare un formato normale.

+1

@BradKoch Grazie per il feedback! Ho aggiunto una spiegazione dei flag della riga di comando, che mi saranno utili quando tornerò su questa domanda in seguito, perché ho dimenticato come farlo. – funroll

4

È possibile utilizzare qualcosa di simile.

$ cat test_file.txt 
54 68 69 73 20 69 73 20 74 65 78 74 20 64 61 74 61 2e 0a 4f 6e 65 20 6d 6f 72 65 20 6c 69 6e 65 20 6f 66 20 74 65 73 74 20 64 61 74 61 2e 

$ for c in `cat test_file.txt`; do printf "\x$c"; done; 
This is text data. 
One more line of test data. 
+0

Sto cercando di decodificare dati misteriosi da un gioco (Elite: Dangerous) che sembra decimale, sembra funzionare (con '\\' invece di '\ x'). (: – seaturtle

0

I valori forniti sono UTF-8 valori. Quando è impostato, l'array di:

declare -a ARR=(0xA7 0x9B 0x46 0x8D 0x1E 0x52 0xA7 0x9B 0x7B 0x31 0xD2) 

sarà analizzata per stampare i caratteri in chiaro di ogni valore.

for ((n=0; n < ${#ARR[*]}; n++)); do echo -e "\u${ARR[$n]//0x/}"; done 

E l'uscita produrrà alcuni caratteri stampabili e alcuni caratteri non stampabili come mostrato qui:

enter image description here

Per convertire i valori esadecimali di testo in chiaro utilizzando il comando echo:

echo -e "\x<hex value here>" 

E per convertire i valori UTF-8 in testo normale utilizzando il comando echo:

echo -e "\u<UTF-8 value here>" 

E poi per la conversione ottale al testo in chiaro usando il comando echo:

echo -e "\0<octal value here>" 

Quando si hanno valori di codifica che non hanno familiarità con, prendere il tempo di controllare gli intervalli nella codifica comune schemi per determinare a quale codifica appartiene un valore. Quindi la conversione da lì è un gioco da ragazzi.

Problemi correlati