Готовый C ++ шестнадцатеричный код дампа - PullRequest
16 голосов
/ 27 августа 2008

Я много работаю с сетевым и последовательным коммуникационным программным обеспечением, поэтому мне часто необходимо иметь код для отображения или записи шестнадцатеричных дампов пакетов данных.

Каждый раз, когда я делаю это, я пишу еще одну процедуру шестнадцатеричного дампа с нуля. Я собираюсь сделать это снова, но подумал, что я спрошу здесь: есть ли какой-нибудь хороший бесплатный код шестнадцатеричного дампа для C ++ где-нибудь?

Особенности, которые я хотел бы:

  • N байтов на строку (где N так или иначе настраивается)
  • необязательный дамп ASCII / UTF8 рядом с гексом
  • настраиваемый отступ, префиксы для каждой строки, суффиксы для каждой строки и т. Д.
  • минимальные зависимости (в идеале, я бы хотел, чтобы весь код находился в заголовочном файле или был фрагментом кода, в который я могу просто вставить)

Редактировать: Пояснение: я ищу код, который я мог бы легко вставить в свои собственные программы для записи в stderr, stdout, файлы журнала или другие подобные выходные потоки. Я не ищу утилиту шестнадцатеричного дампа командной строки.

Ответы [ 7 ]

39 голосов
/ 27 августа 2008

Я часто использую этот небольшой фрагмент, который я написал давно. Его легко и просто добавить в любом месте при отладке и т. Д. *

#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");
  }
}
6 голосов
/ 27 августа 2008

Инструмент Unix xxd распространяется как часть vim, и в соответствии с http://www.vmunix.com/vim/util.html#xxd, источником для xxd является ftp: //ftp.uni-erlangen .de: 21 / паб / утилиты / и т.д. / XXD-1.10.tar.gz . Он был написан на C и составляет около 721 строки. Единственная информация о лицензировании, предоставленная для этого, является:

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

Инструмент Unix hexdump доступен с http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html. Он написан на C и может быть скомпилирован из исходного кода. Это немного больше, чем xxd, и распространяется под лицензией GPL.

2 голосов
/ 27 сентября 2013

На всякий случай, если кто-то найдет это полезным ...

В этом ответе я нашел реализацию одной функции для ascii / hex dumper .

Версия C ++, основанная на том же ответе с цветами терминала ANSI, может быть найдена здесь .

Более легкий, чем xxd.

1 голос
/ 27 августа 2008

Я использовал это в одном из моих внутренних инструментов на работе.

1 голос
/ 27 августа 2008

Я видел PSPad , используемый в качестве шестнадцатеричного редактора, но я обычно делаю то же, что и вы. Я удивлен, что нет «мгновенного ответа» на этот вопрос. Это очень распространенная потребность.

1 голос
/ 27 августа 2008

Не могли бы вы написать свой собственный диссектор для Wireshark?

Изменить: написано до точности в вопросе

0 голосов
/ 27 августа 2008

xxd - это «стандартная» утилита шестнадцатеричного дампа, и похоже, что она должна решить ваши проблемы

...