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

StackOverflow https://stackoverflow.com/questions/191652

我经常与各种设备进行串行通信,因此我经常需要分析日志文件中的十六进制转储。目前,我通过查看转储、查看协议规范并写下结果来手动执行此操作。然而,这是乏味且容易出错的,特别是当消息包含数百个字节并且包含大端和小端数据、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 看起来都很有前途;我会看一下这些,并且可能会将赏金授予适合我需要的人。但我仍然对其他想法持开放态度。

有帮助吗?

解决方案

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

其他提示

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

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

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

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

另一个选项可能是 NetPDL

您应该使用 Tcl 二进制文件 像这样的命令。以下是上面示例的起点。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

当您执行字节顺序操作时,您会切换字节而不是位,所以我不太确定您在那里寻找什么。不管怎样,这会让你开始。

查看 hexworkshop

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

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

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

更新:这不完全是你想要的,但看看 Parse :: Binary :: FixedFormat

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top