Готовый шестнадцатеричный код дампа C++
Вопрос
Я много работаю с программным обеспечением для сетевых и последовательных коммуникаций, поэтому мне часто необходимо иметь код для отображения или регистрации шестнадцатеричных дампов пакетов данных.
Каждый раз, когда я это делаю, я пишу еще одну процедуру шестнадцатеричного дампа с нуля.Собираюсь сделать это еще раз, но решил спросить здесь:Есть ли где-нибудь хороший бесплатный шестнадцатеричный код дампа для 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 используется как шестнадцатеричный редактор, но обычно я делаю то же самое, что и вы.Я удивлен, что на этот вопрос нет «мгновенного ответа».Это очень распространенная потребность.
я использовал это в одном из моих внутренних инструментов на работе.
Не могли бы вы написать свой собственный диссектор для Вайршарка?
Редактировать:написано перед точностью в вопросе
ххд это «стандартная» утилита шестнадцатеричного дампа, и похоже, что она должна решить ваши проблемы