现有的C ++ Hex Dump Code

时间:2008-08-27 00:18:19

标签: c++ logging hex hexdump

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

每次我这样做,我都会从头开始编写另一个hex-dump例程。我将要再次这样做,但我想在这里问:那里有C ++的任何好的免费十六进制转储代码吗?

我想要的功能:

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

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

7 个答案:

答案 0 :(得分:39)

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

#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");
  }
}

答案 1 :(得分: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.

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

答案 2 :(得分:2)

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

我找到了ascii / hex dumper in this answer的单一函数实现。

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

比xxd更轻量级。

答案 3 :(得分:1)

你能为Wireshark撰写own dissector吗?

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

I used this在我的一个内部工具中。

答案 6 :(得分:0)

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