用于将十六进制转储转换为人类可读形式的任何通用实用程序或库?

时间:2008-10-10 14:40:53

标签: hex protocols binaryfiles hexdump

我使用各种设备进行串行通信时工作很多,因此我经常需要分析日志文件中的十六进制转储。目前,我通过查看转储,查看协议规范以及写下结果来手动执行此操作。然而,这是繁琐且容易出错的,尤其是whem消息包含数百个字节并包含big-endian和little-endian数据,ASCII,Unicode,压缩,CRC的混合。 。 。

我编写了一些Python脚本来帮助处理更常见的情况。但是有很多协议需要处理,除非我知道我要分析很多转储,否则花时间编写自定义脚本是没有意义的。

我想要的是某种可以自动执行此活动的实用程序。所以,例如,如果我有这样的文本十六进制转储:

7e ff 00 7b  00 13 86 04
00 41 42 43  44 56 ef 7e

和消息格式的某种描述,如下所示:

# Field         Size        Byte Order  Output Format
Flag            1                       hex
Address         1                       hex
Control         1                       hex
DataType        1                       decimal
LineIndex       1                       decimal
PollAddress     2           msb         hex
DataSize        2           lsb         decimal
Data            (DataSize)              ascii
CRC             2           lsb         hex
Flag            1                       hex

我会得到这样的输出:

Flag            0x7e
Address         0xff
Control         0x00
DataType        123
LineIndex       0
PollAddress     0x1386
DataSize        4
Data            "ABCD"
CRC             0xef56
Flag            0x7e

基于硬件的协议分析器通常具有执行此类操作的奇特功能,但我需要使用文本日志文件。

是否存在任何此类实用程序或库?


自我设置赏金以来,已经出现了一些好的答案。我猜赏金有效!

Wireshark和HexEdit看起来都很有希望;我会看看那些,并且可以将赏金奖励给任何符合我需求的奖品。但我仍然对其他想法持开放态度。

10 个答案:

答案 0 :(得分:2)

Wireshark非常擅长打开网络协议。

答案 1 :(得分:2)

我想你需要一个好的十六进制编辑器。看看hexedit。我过去使用过免费版本,这很好,但我不知道它是否提供了你想要的东西。基本上你希望能够定义一个结构,然后能够解码十六进制数据。我想一个好的十六进制编辑器会支持这个。检查HexEdit的付费版本或google以获取其他编辑器;有很多可用的。

答案 2 :(得分:1)

通常,我使用emacs hexl-mode将二进制文件视为“文本转储”。当我需要更具体的输出时,我就像你一样,用C ++编写解析器。

答案 3 :(得分:1)

在我的工作中,我们正在设计网络和串行协议来控制嵌入式硬件。我也厌倦了读取转储错误,并为每个协议编写脚本,所以我写了一个库来完成你所描述的内容。你可以给它一个协议的文本文件描述,它有一个gui支持复选框,用于设置单个位,单选按钮用于选择有效的位组合,下拉列表有很多选项。您可以编辑数据的十六进制视图,每个字段的二进制视图,甚至可以指向并单击字段,所有其他视图都将更新。它为我们节省了大量时间。它有点快速和肮脏,但如果它不属于我的雇主,我会发布它。关键是,编写起来并不是很难,一旦我离开每个协议的脚本和一个能够理解协议描述的程序,事情就会很棒。我们停止了与误读转储有关的问题,并且添加新协议变得微不足道。此外,协议的文字描述直接进入了开发规范,因此软件人员将知道如何处理硬件。我鼓励你采取行动。

答案 4 :(得分:1)

一个可能的起点是libPDL,一个C ++库。

另一个选项可能是NetPDL

答案 5 :(得分:1)

你应该使用Tcl binary命令来做这样的事情。以下是上述示例的起点。 Tcl非常容易学习和编写脚本。如果你正在做串行通信,你应该自己去学习至少基础知识。

bash$ tclsh
% binary scan [binary format H* 7eff007b00138604004142434456ef7e] \
  H2H2H2ccH4sa4h4H2 \
  flag1 addr ctl datatype lineidx polladdr datasize data crc flag2
10
% puts "$flag1 $addr $ctl $datatype $lineidx \
  $polladdr $datasize $data $crc $flag2"
7e ff 00 123 0 1386 4 ABCD 65fe 7e

当你完成字节顺序的东西时,你切换了字节​​而不是位,所以我不确定你在那里寻找什么。无论如何,这将让你开始。

答案 6 :(得分:1)

查看hexworkshop

我多年来一直在使用它来分析十六进制转储。它有一个结构Viewer,允许您以C / C ++样式定义数据结构a,然后以该格式显示数据。

答案 7 :(得分:1)

WinHex支持显示/编辑用户定义的记录格式。 http://www.x-ways.net/winhex/templates/index.html

有一些例子

答案 8 :(得分:0)

我很确定我在CPAN上看到了类似的东西。如果你愿意,我可能会更模糊。 : - )

更新:这不完全符合您的要求,但请查看Parse::Binary::FixedFormat

答案 9 :(得分:0)

有一个名为hexdump的BSD命令行实用程序,它通过使用格式字符串(可以在外部文件中)来完成此操作。有关简介,请参阅https://www.suse.com/communities/blog/making-sense-hexdump/,例如https://www.freebsd.org/cgi/man.cgi?query=hexdump&sektion=1用于手册页(特别注意-e-f选项以及标题为格式的部分。