Pregunta

Trabajo mucho con software de comunicaciones en serie y de red, por lo que a menudo es necesario tener un código para mostrar o registrar volcados hexadecimales de paquetes de datos.

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

Características que me gustaría:

  • N bytes por línea (donde N es de alguna manera configurable)
  • volcado ASCII/UTF8 opcional junto al hexadecimal
  • sangría configurable, prefijos por línea, sufijos por línea, etc.
  • dependencias mínimas (idealmente, me gustaría que todo el código esté en un archivo de encabezado o sea un fragmento que pueda simplemente pegar)

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

¿Fue útil?

Solución

La herramienta Unix xxd se distribuye como parte de vim, y según 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 aproximadamente 721 líneas.La única información de licencia proporcionada es esta:

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

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

Otros consejos

A menudo utilizo este pequeño fragmento que escribí hace mucho tiempo.Es breve y fácil de agregar en cualquier lugar durante la depuración, 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");
  }
}

Por si a alguien le resulta útil...

He encontrado una implementación de función única para ascii/hex dumper en esta respuesta.

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

Más ligero que xxd.

He visto PS Pad Se utiliza como editor hexadecimal, pero normalmente hago lo mismo que tú.Me sorprende que no haya una "respuesta instantánea" para esta pregunta.Es una necesidad muy común.

Yo usé esto en una de mis herramientas internas en el trabajo.

¿Podrías escribir tu propio disector ¿Para Wireshark?

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

xdd es la utilidad de volcado hexadecimal 'estándar' y parece que debería resolver sus problemas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top