5

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

4

10 回答 10

2

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

于 2009-02-05T17:54:41.140 回答
2

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

于 2009-02-05T20:57:24.343 回答
1

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

于 2009-02-05T17:57:20.433 回答
1

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

于 2009-02-05T18:31:12.033 回答
1

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

另一种选择可能是NetPDL

于 2009-02-06T07:32:15.530 回答
1

你应该使用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

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

于 2009-02-06T09:02:42.993 回答
1

看看hexworkshop

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

于 2009-02-07T05:57:52.863 回答
1

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

于 2009-02-07T06:08:20.550 回答
0

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

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

于 2008-10-10T14:42:47.937 回答
0

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

于 2017-04-29T19:03:02.247 回答