问题标签 [kaitai-struct]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
980 浏览

python - Kaitai Struct:带条件的计算实例

我正在尝试让 Kaitai Struct 对二进制结构进行逆向工程。seq字段按预期工作,但instances似乎没有按我希望的那样工作。

我的二进制格式包括一个带有常量列表的标题,我将其解析为header带有consts数组子字段的字段:

但是,当我尝试使用以下声明时:

这个旨在index_const通过查找header.consts当且仅当idx在 [0x40..0x4f] 范围内的数组来计算 的值。

我使用 Python 作为我的目标语言,我假设它应该生成如下代码:

但是,我得到的是:

只是我,我错过了一些明显的东西,还是 Kaitai Struct 中的错误?

0 投票
1 回答
591 浏览

java - 使用 Kaitai Struct 解析操作码

在 Kaitai Struct 中迈出第一步,我一直在尝试将 BSON 解析器作为练习。我解析 BSON 元素的 .ksy 代码现在看起来像这样:

您可能已经注意到,有很多重复。if每当一个人想要做额外的元素类型时,就需要去重复块。更糟糕的是,您基本上必须在每个此类字段中复制 3 次内容,即:

我的目标语言是Java。在 Kaitai 之前,我只尝试过 Preon,我们有这样的子句:

在那里,您会根据“前缀”的值自动获取这两个元素。在开泰可以吗?

0 投票
1 回答
353 浏览

java - Kaitai Struct:通过一些字段实现容错

在 Kaitai Struct 中解析截断的日志时,有什么方法可以传递某些字段?因为如果它读取一个字段(类型指定为枚举)但值不在其中,它将引发NullPointer Exception
所以我想问是否有任何方法可以实现这一点,就像default: passpython 库Construct中的属性一样

这是我的ksy文件:

谢谢您的回复 :)

0 投票
1 回答
592 浏览

python - Python:使用 Kaitai Struct 读取 ID3v1 标签

我正在尝试让 Kaitai Struct 解析 MP3 的 ID3v1 标签格式。根据标准,它是位于某个偏移量处的固定格式结构——但诀窍是这个偏移量不是从文件的开头计算的,而是从结尾计算的。

这是标签的基本.ksy轮廓,我认为它不应该真正改变:

这是我关于如何从 128 个字节到文件末尾读取它的幼稚想法:

我尝试使用一个简单的 Python 测试脚本:

但是,它似乎将负数直接传递到 Python 的 File 对象中seek(),因此失败了:

回溯(最后一次调用):文件“try-id3.py”,第 6 行,在 print(f.id3v1_tag) 文件“id3v1_1.py”,第 171 行,在 id3v1_tag self._io.seek(-128) 文件中“ kaitaistruct.py",第 29 行,在 seek self._io.seek(n) IOError: [Errno 22] Invalid argument

在其他一些同样疯狂的想法之后,我找到了一种解决方法:我可以省略任何pos参数,.ksy然后手动寻找脚本中的正确位置:

这行得通,但感觉真的很hackish :(在 Kaitai Struct 和 Python 中有更好的方法吗?

0 投票
1 回答
107 浏览

windows - Windows 注册表数据库解析

我正在尝试使用此问题作为参考,使用Kaitai Web IDE解析 Windows 注册表数据库配置单元文件格式,但我遇到了问题。我最感兴趣的配置单元是,它超过 90 MB。c:\windows\system32\config\software

当我尝试在 Kaitai Web IDE 中加载它时,我只加载了前 0x97d680 个字节。看起来其他所有内容都被截断了。

我的第一个猜测是,这可能是某种浏览器限制。0x97d680 字节是十进制的 9950848。事实上,经过一番谷歌搜索后,我发现现代浏览器中称为“本地存储”的东西有 10 MB 的限制。

我在 Windows 10 上使用 Google Chrome 56.0.2924.9。有什么想法可以尝试缓解此限制吗?

0 投票
0 回答
621 浏览

c++ - c++ 使用位域解析二进制消息库

嗨,是否有任何支持模式中位字段的下降二进制解析器和构建器库(我的意思是协议中的字段具有任意位长度,而不是标准的 int 32 位等)。Protobuf 和 Flatbuffers 并不支持它。Kaitai 只是解析器而不是数据包生成器。

0 投票
1 回答
355 浏览

python - Parse an item depending on previous elements

To give some context, I am parsing a DICOM file, and having difficulties using the Transfer Syntax entry to determine whether to use implicit or explicit parsing. But let me define a simplified syntax, so no dicom knowledge is required.

We have a sequence of entries, each entry has a group number , and a data part. The group number is always represented as u2, but the data can be of different types, lets say u2 or u4. The order of the entries can be arbitrary, except that all the entries with group number == 2 must be at the top. All entries with group number == 2 has a data type of u2, but subsequent data parts can differ.

And here comes the hard part: all the items with group number != 2 have data type u4 if and only if an entry exactly like this was present previously:

In python for example, I would parse it like this:

Is there a way to achieve this using kaitai-struct?

0 投票
2 回答
494 浏览

java - 使用三元运算符计算长度

我有一个二进制结构,它有一个以位为单位的长度字段和对应于该长度的值字段。值长度用足够的尾随位填充,以使字段的结尾落在八位字节边界上。我需要计算那个长度,例如: for length = 24 bits; value length = 3 octets for length = 17 bits; value length = 3 octets for length = 31 bits; value length = 4 octets 等。

正如我在文档中阅读的那样,可以在文件中使用三元运算符.ksy。所以我有以下表达式来计算值字段大小:

此表达式在 Kaitai WebIDE 中完美运行,但是当我尝试生成 java 类时:

我收到以下错误:

我还尝试在单独的计算值中计算附加八位组的值,如下所示:

但是会发生同样的错误。

0 投票
1 回答
826 浏览

hex - 解析十六进制转储

我最近遇到了一个kaitai 结构来处理任意二进制格式。现在问题是我有一个十六进制转储我的意思是我有一个要解析的文件,当我在kaitaiweb ide中使用可视化器进行数据映射时,它是十六进制格式,它正在转换十六进制数据再次转换为十六进制有什么方法可以在我使用可视化工具时将数据从十六进制转换并获得准确的十六进制数据。

例如考虑这个 3335363330 然后再次将其映射到 33 33 33 35 33 36 33 33 33 30

提前致谢

0 投票
1 回答
792 浏览

java - 开泰代码编写

我最近开始使用kaitai-struct来处理任意二进制格式。我为我的数据创建了.ksy文件,并将其解析为目标语言java。现在谁能指出我如何传递包含数据的输入文件以及如何获取被解析为输出的数据,以便我可以编写代码来操作该数据以满足我的要求?是否有任何关于如何根据我们获得的数据编写代码的教程。

提前致谢。