Qualche utilità o libreria generica per convertire i dump esadecimali in un formato leggibile dall'uomo?

StackOverflow https://stackoverflow.com/questions/191652

Domanda

Lavoro molto con le comunicazioni seriali con una varietà di dispositivi, quindi spesso devo analizzare i dump esadecimali nei file di registro. Attualmente, lo faccio manualmente guardando i dump, guardando le specifiche del protocollo e scrivendo i risultati. Tuttavia, questo è noioso e soggetto a errori, specialmente quando i messaggi contengono centinaia di byte e contengono miscele di dati big-endian e little-endian, ASCII, Unicode, compressione, CRC,. . . .

Ho scritto alcuni script Python per aiutare con i casi più comuni. Ma ci sono molti protocolli da affrontare e non ha senso dedicare del tempo a scrivere uno script personalizzato a meno che non sappia che avrò molti dump da analizzare.

Quello che mi piacerebbe è una sorta di utility in grado di automatizzare questa attività. Quindi, per esempio, se ho una discarica esadecimale testuale come questa:

7e ff 00 7b  00 13 86 04
00 41 42 43  44 56 ef 7e

e una sorta di descrizione del formato del messaggio, in questo modo:

# Field         Size        Byte Order  Output Format
Flag            1                       hex
Address         1                       hex
Control         1                       hex
DataType        1                       decimal
LineIndex       1                       decimal
PollAddress     2           msb         hex
DataSize        2           lsb         decimal
Data            (DataSize)              ascii
CRC             2           lsb         hex
Flag            1                       hex

Otterrei un output in questo modo:

Flag            0x7e
Address         0xff
Control         0x00
DataType        123
LineIndex       0
PollAddress     0x1386
DataSize        4
Data            "ABCD"
CRC             0xef56
Flag            0x7e

Gli analizzatori di protocollo basati su hardware hanno spesso funzioni fantasiose per fare questo tipo di cose, ma devo lavorare con i file di registro testuali.

Esiste tale utilità o libreria?


Alcune buone risposte sono arrivate da quando ho creato la taglia. Immagino che le taglie funzionino!

Wireshark e HexEdit sembrano entrambi promettenti; Daremo un'occhiata a quelli e assegnerò probabilmente la generosità a qualunque si adatti alle mie esigenze. Ma sono ancora aperto ad altre idee.

È stato utile?

Soluzione

Wireshark è abbastanza bravo ad aprire i protocolli di rete.

Altri suggerimenti

Suppongo che tu abbia bisogno di un buon editor esadecimale. Dai un'occhiata a hexedit . Ho usato la versione gratuita in passato ed è buono, ma non so se offre quello che stai cercando. Fondamentalmente vuoi essere in grado di definire una struttura e quindi essere in grado di decodificare i dati esadecimali contro di essa. Suppongo che un buon editor esadecimale lo sosterrebbe. Controlla la versione a pagamento di HexEdit o google per un altro editor; ce ne sono molti disponibili.

In genere, utilizzo la modalità hexl di emacs per visualizzare i file binari come "text-dump". Quando ho bisogno di un output più specifico, faccio solo come te e scrivo un parser in C ++.

Nel mio lavoro stavamo progettando protocolli di rete e seriali per controllare l'hardware incorporato. Mi sono anche stancato di leggere i dump in modo errato e di scrivere script per ciascun protocollo, quindi ho scritto una libreria per fare esattamente quello che descrivi. Potresti dargli una descrizione del file di testo del protocollo, e aveva una gui che supportava caselle di controllo per impostare singoli bit, pulsanti di opzione per scegliere tra le combinazioni valide di bit ed elenchi a discesa quando c'erano molte scelte. È possibile modificare la vista esadecimale dei dati, la vista binaria di ciascun campo o persino puntare e fare clic sui campi e tutte le altre viste verranno aggiornate. Ci ha fatto risparmiare un sacco di tempo. È un po 'veloce e sporco, ma lo pubblicherei se non fosse di proprietà del mio datore di lavoro. Il punto è che non è stato molto difficile scrivere, e una volta che sono passato dagli script per ciascun protocollo e per un programma in grado di comprendere una descrizione del protocollo, le cose erano grandi. Abbiamo smesso di rovinare i problemi relativi alla lettura errata di una discarica e l'aggiunta di nuovi protocolli è diventata banale. Inoltre la descrizione testuale del protocollo è andata direttamente nelle specifiche di sviluppo in modo che i ragazzi del software sapessero cosa fare dell'hardware. Ti incoraggio a fare un tentativo.

Un possibile punto di partenza sarebbe libPDL , una libreria C ++.

Un'altra opzione potrebbe essere NetPDL .

Dovresti usare i comandi Tcl binary per cose come questo. Quello che segue è il punto di partenza per il tuo esempio sopra. Tcl è davvero facile da imparare e scrivere script. Se stai facendo cose di comunicazione seriale devi a te stesso imparare almeno le basi.

bash$ tclsh
% binary scan [binary format H* 7eff007b00138604004142434456ef7e] \
  H2H2H2ccH4sa4h4H2 \
  flag1 addr ctl datatype lineidx polladdr datasize data crc flag2
10
% puts "$flag1 $addr $ctl $datatype $lineidx \
  $polladdr $datasize $data $crc $flag2"
7e ff 00 123 0 1386 4 ABCD 65fe 7e

Quando hai fatto le tue cose in ordine di byte, hai cambiato i byte ma non i bit, quindi non sono davvero sicuro di quello che stavi cercando lì. Comunque, questo ti farà iniziare.

Dai un'occhiata a hexworkshop

Lo uso da anni per analizzare i dump esadecimali. Ha un visualizzatore di strutture che consente di definire la struttura dei dati in stile C / C ++ e quindi di visualizzare i dati in quel formato.

WinHex supporta la visualizzazione / modifica di formati di record definiti dall'utente. Ci sono alcuni esempi in http://www.x-ways.net/winhex/templates/index.html

Sono abbastanza sicuro di aver visto qualcosa del genere su CPAN. Potrei essere più vago se ti va. : -)

Aggiornamento: non è esattamente quello che vuoi, ma dai un'occhiata a Parse :: Binary :: FixedFormat

Esiste un programma di utilità della riga di comando BSD chiamato hexdump che lo fa attraverso l'uso di stringhe di formato (che possono essere in un file esterno). Vedi https://www.suse.com/communities/blog/making- sense-hexdump / per un'introduzione, ad es https://www.freebsd.org/cgi/man.cgi? query = hexdump & amp; sektion = 1 per la pagina del manuale (con particolare attenzione alle opzioni -e e -f e alla sezione intitolata Formati ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top