2012-11-08 10 views
18

Sto provando ad emettere valori ASCII corrispondenti ad alcuni dati binari. Ho applicato con successo il programma di utilità per hexdump hexdump di uscita e ASCII side-by-side, come di seguito:Utilizzo di hexdump per emettere solo ASCII

00000120 20 20 20 20 3d 20 30 78 30 30 30 30 30 30 33 30 | = 0x00000030| 
00000130 0a 01 00 00 00 23 00 00 00 75 75 69 64 30 20 20 |.....#...uuid0 | 
00000140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d |    =| 
00000150 20 30 78 39 30 38 32 61 63 35 61 0a 01 00 00 00 | 0x9082ac5a.....| 
00000160 23 00 00 00 75 75 69 64 31 20 20 20 20 20 20 20 |#...uuid1  | 
00000170 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 37 34 |   = 0x74| 
00000180 61 37 34 37 36 66 0a 01 00 00 00 23 00 00 00 75 |a7476f.....#...u| 
00000190 75 69 64 32 20 20 20 20 20 20 20 20 20 20 20 20 |uid2   | 
000001a0 20 20 20 20 20 3d 20 30 78 61 32 35 35 35 63 30 |  = 0xa2555c0| 

Tuttavia, vorrei vedere solo l'ASCII come valori di uscita. Non sono interessato ai valori esadecimali. Ad esempio, l'uscita dovrebbe essere il seguente (circa corrispondente a quanto sopra.):

= 0x00000030.....#... 
uuid0=0x9082ac5a..... 
uuid1=0x74a7476f 

(. Non sono stati in grado di utilizzare gli interruttori di hd per questo)

+0

Nel 'cat', ci sono alcuni valori non ASCII. Voglio sbarazzarmi di loro e ho pensato che questa fosse la strada da percorrere :( – recluze

+1

'stringhe 'funziona esattamente.Se lo metti come risposta, posso accettarlo – recluze

risposta

28

Se avete solo bisogno di vedere il contenuto di testo di file binario, strings dovrebbe essere utile:

Per ciascun file dato, GNU strings stampa il carattere stampabile sequenze che sono almeno 4 caratteri (o il numero dato con l'opzione -n e sono seguiti da un carattere non stampabile. strings è principalmente utile per determinare il contenuto dei file non di testo .

+0

Perfetto, grazie – recluze

+0

Meglio aggiungere il' -n 'opzione, ad esempio' stringhe -n 2 a.out | minore -N', perché di default solo la sequenza di caratteri con lunghezza> = 4 viene trattata come stringa da 'stringhe', quindi l'intestazione' ELF' del file binario elf non è stampata di default: –

5

è possibile utilizzare od :

od -t c file 

O awk con hexdump in questo modo:

hexdump -C file | awk '{for(i=NF; i>17; --i) print $i}' 

Nota: è necessario modificare il comando awk se si modifica il numero di colonne in hexdump.

8

Mentre la answer from raina77ow sul comando strings(1) è il modo corretto per ottenere il risultato che in realtà voleva, la richiesta specifica di sfruttare hexdump(1) per filtrare solo caratteri stampabili può avere senso in alcuni contesti. Risponderò a ciò specificamente qui.

L'utilità hexdump risulta supportare un motore di formattazione sorprendentemente generalizzato. Questo probabilmente è stato fatto per rendere più uniforme l'implementazione dei vari formati selezionabili. Se la tua copia di hexdump espone quel motore (come fanno molti) attraverso l'opzione della riga di comando -e, allora puoi effettivamente fare ciò che hai chiesto.

La chiave è l'opzione -e e il linguaggio di formattazione che supporta. Quel linguaggio consente la specifica delle stringhe di formato che consumano byte dell'input e producono testo. Un comando come:

$ hexdump -e "16 \"%_p\" \"\\n\"" hexdump.exe | head -16 

consuma 16 byte alla volta, visualizzarli attraverso il formato %_p, e aggiungere una nuova riga dopo ogni 16 byte. Ogni carattere non stampabile viene sostituito con un . nell'output.

Altri formati orientati ai caratteri da considerare sono %_c e %_u. Il primo sostituisce il carattere non stampabile con la sequenza di escape ANSI-C o con un numero ottale a tre cifre. Il secondo sostituisce la non stampa di ogni carattere con il nome convenzionale del carattere di controllo ASCII o con un numero esadecimale a due cifre.

Se la copia di hexdump manca l'opzione -e, o è lento, o voi manca di un'implementazione di hexdump a tutti, quindi l'attuazione liberamente con licenza, veloce, e ragionevolmente portatile di hexdump recentemente released by William Ahern vale la pena guardare. Dovrebbe essere pronto per un sacco di sistemi simili a Unix, e con solo piccole modifiche che crea con MingW GCC su Windows. Un attributo chiave di questa implementazione è che il singolo file sorgente può essere creato come libreria condivisa per l'inclusione in un altro programma, come un modulo Lua per l'uso da Lua e un eseguibile standalone che implementa il comando hexdump.

+0

Puoi sostituire "" 'di' '' ed evitare l'escape, guarda: 'hexdump -e '16"% _p "" \ n "'' – Bacher

0
hexdump -C file /dev/sda4|cut -c 62-77 

Speranza che aiuta

Problemi correlati