2008-08-27 21 views
13

Trabajo mucho con el software de comunicaciones serie y de red, por lo que a menudo es necesario que tenga código para mostrar o registrar vuelcos hexadecimales de paquetes de datos.Off-the-Shelf C++ Hex Dump Code

Cada vez que hago esto, escribo otra rutina de volcado hexadecimal desde cero. Estoy a punto de hacerlo nuevamente, pero pensé que podría preguntar aquí: ¿hay algún buen código de volcado hexadecimal gratis para C++ en alguna parte?

Características me gustaría:

  • N bytes por línea (donde n es de alguna manera configurable)
  • opcional volcado ASCII/UTF8 junto al hexágono prefijos
  • muesca configurable, por línea, por -line sufijos, etc.
  • dependencias mínimas (a ser posible, me gustaría que el código para todos estar en un archivo de cabecera, o ser un fragmento que sólo puede pegar en)

Editar: Aclaración: Estoy buscando un código que pueda incluir fácilmente en mis propios programas para escribir en stderr, stdout, archivos de registro u otras transmisiones de salida. No estoy buscando una utilidad de volcado hexadecimal de línea de comandos.

Respuesta

6

La herramienta UNIX xxd se distribuye como parte de vim, y de acuerdo con http://www.vmunix.com/vim/util.html#xxd, la fuente de xxd es ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz. Fue escrito en C y tiene alrededor de 721 líneas. La única información de licencia dada para ello es la siguiente:

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

La herramienta UNIX hexdump está disponible en http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html. Fue escrito en C y se puede compilar desde la fuente. Es bastante más grande que xxd y se distribuye bajo la GPL.

1

¿Podría escribir su own dissector para Wireshark?

Editar: por escrito antes de la precisión en la pregunta

1

he visto PSPad utilizado como un editor hexadecimal, pero por lo general hacer lo mismo que tú. Me sorprende que no haya una "respuesta instantánea" para esta pregunta. Es una necesidad muy común.

0

xxd es el util volcado hexadecimal 'estándar' y parece que debe resolver sus problemas

34

A menudo uso este pequeño fragmento que escribí hace mucho tiempo. Es corto y fácil de añadir en cualquier lugar al depurar etc ...

#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"); 
    } 
} 
+1

¡perfecto!esto rocas. Estoy usando un lector de socket y llamé a la función con "hexdump (buffer, bytecount);" ¡Y funciona como un encanto! ¡gracias! –

+0

printf ("% 02x", (sin firmar) (buf [i + j])); – DAG

1

I used this en una de mis herramientas internas en el trabajo.

2

Sólo en caso de que alguien le resulta útil ...

que he encontrado implementación de la función única de dumper ASCII/hexadecimal in this answer.

Se puede encontrar una versión de C++ basada en la misma respuesta con colores de terminal ANSI here.

Más ligero que xxd.