Вопрос

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

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

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

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

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

Это было полезно?

Решение

Инструмент Unix xxd распространяется как часть vim, и согласно http://www.vmunix.com/vim/util.html#xxd, источник xxd ftp://ftp.uni-erlangen.de:21/pub/utilities/etc/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.

Другие советы

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

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

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

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

Можно найти версию C++, основанную на том же ответе с цветами терминала ANSI. здесь.

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

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

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

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

Редактировать:написано перед точностью в вопросе

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top