Pergunta

Eu trabalho muito com rede e comunicações seriais de software, por isso muitas vezes é necessário que eu tenha um código para exibir ou fazer o log hex despejos dos pacotes de dados.

Cada vez que eu faço isso, eu escrevo ainda outra hex dump de rotina a partir do zero.Eu estou prestes a fazê-lo novamente, mas percebi que eu perguntar aqui:Há alguma boa higiene hex dump de código para C++ lá fora em algum lugar?

Características que eu gostaria:

  • N bytes por linha (onde N é de alguma forma configurável)
  • opcional ASCII/UTF8 de despejo juntamente com o hex
  • configurável recuo, por linha de prefixos, por linha de sufixos, etc.
  • o mínimo de dependências (idealmente, eu gostaria que o código em um arquivo de cabeçalho, ou seja, um trecho de apenas posso colar)

Editar: Esclarecimento:Eu estou olhando para o código que eu possa soltar os meus próprios programas para escrever para stderr, stdout, arquivos de log, ou outros tais fluxos de saída.Eu não estou olhando para uma linha de comando dump hexadecimal utilitário.

Foi útil?

Solução

A ferramenta unix xxd é distribuído como parte do vim, e , de acordo com http://www.vmunix.com/vim/util.html#xxd, a fonte para xxd é ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/xxd-1.10.tar.gz.Ele foi escrito em C e está a cerca de 721 linhas.A apenas informações de licenciamento dado para ele é este:

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

A ferramenta unix hexdump está disponível a partir da http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html.Ele foi escrito em C e pode ser compilado a partir do código fonte.É um pouco maior do que xxd, e é distribuído sob a GPL.

Outras dicas

Eu sempre uso esse pequeno trecho que eu escrevi há muito tempo atrás.Ele é curto e de fácil adicionar em qualquer lugar quando a depuração 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");
  }
}

Apenas no caso de alguém acha útil...

Eu descobri que a única função de implementação para ascii/hexadecimal dumper neste resposta.

Uma versão de C++ com base na mesma resposta com terminal ANSI cores pode ser encontrada aqui.

Mais leve do que xxd.

Eu tenho visto PSPad usado como um editor hexadecimal, mas eu costumo fazer a mesma coisa que você fazer.Eu estou surpreso que não há uma "resposta imediata" para esta pergunta.É uma necessidade comum.

Eu usei esse em uma de minhas ferramentas internas no trabalho.

Você poderia escrever o seu próprio dissector para o Wireshark?

Editar:escrito antes da precisão da pergunta

xxd é o 'padrão' hex dump util e parece que ele deve resolver os seus problemas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top