题
我经常使用网络和串行通信软件,因此我通常需要有代码来显示或记录数据包的十六进制转储。
每次执行此操作时,我都会从头开始编写另一个十六进制转储例程。我正准备再次这样做,但我想我会在这里问:是否有任何好的免费 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");
}
}
我见过 PSPad 用作十六进制编辑器,但我通常会做与您相同的事情。我很惊讶这个问题没有“即时答案”。这是一个非常普遍的需求。
我用过这个 在我工作中的一种内部工具中。
你能写下你的 自己的解剖器 对于 Wireshark?
编辑:写在问题精度之前
xxd 是“标准”十六进制转储实用程序,看起来它应该可以解决您的问题
不隶属于 StackOverflow