Domanda

Lavoro molto con software di comunicazione seriale e di rete, quindi spesso è necessario disporre di codice per visualizzare o registrare dump esadecimali dei pacchetti di dati.

Ogni volta che lo faccio, scrivo da zero un'altra routine hex-dump.Sto per farlo di nuovo, ma ho pensato di chiedere qui:Esiste da qualche parte un buon codice hex dump gratuito per C++?

Caratteristiche che vorrei:

  • N byte per riga (dove N è in qualche modo configurabile)
  • dump ASCII/UTF8 opzionale accanto al file esadecimale
  • rientro configurabile, prefissi per riga, suffissi per riga, ecc.
  • dipendenze minime (idealmente, vorrei che il codice fosse tutto in un file di intestazione o fosse uno snippet che posso semplicemente incollare)

Modificare: Una precisazione:Sto cercando codice che posso facilmente inserire nei miei programmi per scrivere su stderr, stdout, file di registro o altri flussi di output simili.Non sto cercando un'utilità di dump esadecimale da riga di comando.

È stato utile?

Soluzione

Lo strumento UNIX xxd è distribuito come parte di vim, e secondo http://www.vmunix.com/vim/util.html#xxd, la fonte di xxd è ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz.È stato scritto in C ed è lungo circa 721 righe.Le uniche informazioni sulla licenza fornite sono queste:

* Distribute freely and credit me,
* make money and share with me,
* lose money and don't ask me.

Lo strumento UNIX hexdump è disponibile da http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html.È stato scritto in C e può essere compilato dal sorgente.È un po' più grande di xxd ed è distribuito sotto licenza GPL.

Altri suggerimenti

Uso spesso questo piccolo frammento che ho scritto molto tempo fa.È breve e facile da aggiungere ovunque durante il debug, ecc...

#include <ctype.h>
#include <stdio.h>

void hexdump(void *ptr, int buflen) {
  unsigned char *buf = (unsigned char*)ptr;
  int i, j;
  for (i=0; i<buflen; i+=16) {
    printf("%06x: ", i);
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%02x ", buf[i+j]);
      else
        printf("   ");
    printf(" ");
    for (j=0; j<16; j++) 
      if (i+j < buflen)
        printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
    printf("\n");
  }
}

Nel caso qualcuno lo trovasse utile...

Ho trovato l'implementazione di una singola funzione per il dumper ascii/hex in questa risposta.

È possibile trovare una versione C++ basata sulla stessa risposta con colori terminali ANSI Qui.

Più leggero di xxd.

Ho visto PSPad usato come editor esadecimale, ma di solito faccio la stessa cosa che fai tu.Sono sorpreso che non ci sia una "risposta immediata" per questa domanda.È un bisogno molto comune.

Ho usato questo in uno dei miei strumenti interni al lavoro.

Potresti scrivere il tuo proprio dissettore per WireShark?

Modificare:scritto prima della precisione nella domanda

xxd è l'utility di dump esadecimale "standard" e sembra che dovrebbe risolvere i tuoi problemi

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