Подтвердить что ты не робот

Off-the-Shelf С++ Hex Dump Code

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

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

Функции, которые я хотел бы:

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

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

4b9b3361

Ответ 1

Инструмент 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.

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 5

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

Ответ 7

xxd - это стандартная утилита hex dump и выглядит так, как будто она должна решить ваши проблемы.