关于日志记录:现成的C ++十六进制转储代码

关于日志记录:现成的C ++十六进制转储代码

Off-the-Shelf C++ Hex Dump Code

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

每次执行此操作时,我都会从头开始编写另一个十六进制转储例程。 我将再次执行此操作,但想想我会在这里问:在某处是否有C ++的良好免费十六进制转储代码?

我想要的功能:

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

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


我经常使用很久以前写的这个小片段。在调试等任何地方都可以轻松简便地添加...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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("\
"
);
  }
}

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行。给出的唯一许可信息是:

1
2
3
* Distribute freely and credit me,
* make money and share with me,
* lose money and don't ask me.

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


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

我在此答案中找到了针对ascii / hex垃圾堆的单一功能实现。

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

比xxd更轻巧。


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


我已经看到PSPad用作十六进制编辑器,但是我通常会做与您相同的事情。我很惊讶没有这个问题的"即时答案"。这是非常普遍的需求。


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

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


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


推荐阅读