Off-the-Shelf С++ Hex Dump Code
Я много работаю с сетевым и последовательным коммуникационным программным обеспечением, поэтому мне часто необходимо, чтобы код отображал или записывал шестнадцатеричные дампы пакетов данных.
Каждый раз, когда я это делаю, я пишу еще одну процедуру с шестнадцатеричным дампом с нуля. Я собираюсь сделать это снова, но подумал, что я бы спросил здесь: есть ли какой-нибудь хороший бесплатный код дампа для С++ где-то там?
Функции, которые я хотел бы:
- N байтов на строку (где N как-то настраивается)
- необязательный дамп ASCII/UTF8 вместе с шестнадцатеричным
- настраиваемый отступ, префикс строки, суффикс строки и т.д.
- минимальные зависимости (в идеале, я хотел бы, чтобы код был в файле заголовка или был фрагментом, который я могу просто вставить)
Изменить: Уточнение: я ищу код, который я могу легко занести в свои собственные программы для записи в stderr, stdout, файлы журналов или другие такие выходные потоки. Я не ищу утилиту hex dump командной строки.
Ответы
Ответ 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.
Ответ 4
Не могли бы вы написать собственный диссектор для Wireshark?
Изменить: записать перед точностью в вопросе
Ответ 5
Я видел PSPad, используемый в качестве шестнадцатеричного редактора, но я обычно делаю то же самое, что и вы. Я удивлен, что не был "мгновенный ответ" на этот вопрос. Это очень распространенная потребность.
Ответ 6
Я использовал это в одном из моих внутренних инструментов на работе.
Ответ 7
xxd - это стандартная утилита hex dump и выглядит так, как будто она должна решить ваши проблемы.