17

我经常使用网络和串行通信软件,因此我经常需要编写代码来显示或记录数据包的十六进制转储。

每次我这样做时,我都会从头开始编写另一个十六进制转储例程。我即将再次这样做,但我想我会在这里问:在某处是否有任何适用于 C++ 的免费十六进制转储代码?

我想要的功能:

  • 每行 N 个字节(其中 N 可以以某种方式配置)
  • 十六进制旁边的可选 ASCII/UTF8 转储
  • 可配置缩进、每行前缀、每行后缀等。
  • 最小的依赖关系(理想情况下,我希望代码都在头文件中,或者是我可以粘贴的片段)

编辑: 澄清:我正在寻找可以轻松放入我自己的程序以写入标准错误、标准输出、日志文件或其他此类输出流的代码。我不是在寻找命令行十六进制转储实用程序。

4

7 回答 7

47

我经常使用我很久以前写的这个小片段。在调试等时,它很简短,很容易在任何地方添加......

#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");
  }
}
于 2008-08-27T10:35:45.167 回答
6

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.

hexdump可从http://gd.tuwien.ac.at/softeng/Aegis/hexdump.html获得unix 工具。它是用 C 语言编写的,可以从源代码编译。它比 xxd 大很多,并且在 GPL 下分发。

于 2008-08-27T02:42:07.507 回答
3

以防万一有人发现它有用...

在这个答案中找到了 ascii/hex dumper 的单一功能实现。

可以在此处找到基于与 ANSI 终端颜色相同的答案的 C++ 版本。

比 xxd 更轻量级。

于 2013-09-27T09:13:22.007 回答
1

你可以为 Wireshark编写自己的解剖器吗?

编辑:写在问题的精度之前

于 2008-08-27T00:35:06.233 回答
1

我见过PSPad用作十六进制编辑器,但我通常会做同样的事情。我很惊讶这个问题没有“即时答案”。这是一个非常普遍的需求。

于 2008-08-27T00:58:25.367 回答
1

在工作中的一个内部工具中使用了它。

于 2008-08-27T19:40:44.327 回答
0

xxd是“标准”十六进制转储工具,看起来应该可以解决您的问题

于 2008-08-27T01:28:33.783 回答