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

问题描述 投票:0回答:10

我经常与各种设备进行串行通信,因此我经常需要分析日志文件中的十六进制转储。 目前,我通过查看转储、查看协议规范并写下结果来手动执行此操作。 然而,这是乏味且容易出错的,特别是当消息包含数百个字节并且包含大端和小端数据、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

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

是否存在这样的实用程序或库?

hex protocols binaryfiles hexdump
10个回答
2
投票

Wireshark在开放网络协议方面相当擅长。


2
投票

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


1
投票

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


1
投票

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


1
投票

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

另一个选项可能是 NetPDL


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

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


1
投票

看看hexworkshop

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


1
投票

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

有一些示例

1
投票

有一个名为

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


0
投票

我很确定我在 CPAN 上看到过类似的内容。 如果你愿意的话我可以说得更含糊一些。 :-)

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

© www.soinside.com 2019 - 2024. All rights reserved.