我使用各种设备进行串行通信时工作很多,因此我经常需要分析日志文件中的十六进制转储。目前,我通过查看转储,查看协议规范以及写下结果来手动执行此操作。然而,这是繁琐且容易出错的,尤其是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看起来都很有希望;我会看看那些,并且可以将赏金奖励给任何符合我需求的奖品。但我仍然对其他想法持开放态度。
答案 0 :(得分:2)
Wireshark非常擅长打开网络协议。
答案 1 :(得分:2)
我想你需要一个好的十六进制编辑器。看看hexedit。我过去使用过免费版本,这很好,但我不知道它是否提供了你想要的东西。基本上你希望能够定义一个结构,然后能够解码十六进制数据。我想一个好的十六进制编辑器会支持这个。检查HexEdit的付费版本或google以获取其他编辑器;有很多可用的。
答案 2 :(得分:1)
通常,我使用emacs hexl-mode将二进制文件视为“文本转储”。当我需要更具体的输出时,我就像你一样,用C ++编写解析器。
答案 3 :(得分:1)
在我的工作中,我们正在设计网络和串行协议来控制嵌入式硬件。我也厌倦了读取转储错误,并为每个协议编写脚本,所以我写了一个库来完成你所描述的内容。你可以给它一个协议的文本文件描述,它有一个gui支持复选框,用于设置单个位,单选按钮用于选择有效的位组合,下拉列表有很多选项。您可以编辑数据的十六进制视图,每个字段的二进制视图,甚至可以指向并单击字段,所有其他视图都将更新。它为我们节省了大量时间。它有点快速和肮脏,但如果它不属于我的雇主,我会发布它。关键是,编写起来并不是很难,一旦我离开每个协议的脚本和一个能够理解协议描述的程序,事情就会很棒。我们停止了与误读转储有关的问题,并且添加新协议变得微不足道。此外,协议的文字描述直接进入了开发规范,因此软件人员将知道如何处理硬件。我鼓励你采取行动。
答案 4 :(得分:1)
答案 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)
我多年来一直在使用它来分析十六进制转储。它有一个结构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
选项以及标题为格式的部分。