关于在 C++ 中解析二进制文件的问题
Question about parsing a binary file in C++
所以我得到了这个面试任务,它看起来有点混乱。
我的工作是,我得到了几个二进制文件(例如联系人、电话等),我需要尽可能多地提取信息。
我使用 Hex Fiend(picture of hex fiend here) and i got a picture of how the calls should look like(picture of the calls here) 解码了二进制文件。
我的作业是用 C++ 编写的,我设法提取了 phone 数字和 "TO" 标签等信息,但所有其他数据似乎都无法读取为字符。它是否被编码为 ascii 消息,如 headers 的描述,标签应该在哪里,或者它应该是 corrupted/unreadable?
我应该也能提取日期和持续时间。
到目前为止,我已经解析了文件,所以当一个字符小于或等于 31 且大于或等于 127 时将其替换为空格,这样我就可以看到对应于实际数据的 letters/numbers就像 phone 个数字。
我解决这类问题的主要思路是弄清楚二进制的结构。
例如 01020304 可能是一个 header 表示这是一个日志并且有数据。
关于如何解决剩余问题的任何想法?
提前致谢!
此文件看起来包含 fixed-length 条记录,并且可以选择包含 header。
我计算了其中两个 EFCD 标记(0x34e 和 0x3b8)之间的距离,得出 106(或 0x6a)。尝试调整十六进制查看器的大小,使 106 成为准确的行数。
6360正好是106的倍数,所以好像没有header和footer
详细看一条记录。我选择了从 0x1a8 开始的那个,因为它有一些我们可以看的文本。
- 偏移量 0x00:对于其中一些标记而言似乎不同的某种序列号。我们不知道它有多大,所以我们现在猜测 4 个字节。
- 偏移量 0x04:对于大多数记录,这是 FF00 或 FF02。 2 个字节。
- 偏移量 0x06:几乎总是 FFFF,但并非总是如此。也是2个字节?
- Offset 0x0C:这有点像时间戳? 4 个字节
- 偏移量 0x10:终于,我们识别出了一些文本!看起来它在 UCS-2 中,中间有所有这些 00 字节。由于记录的大小是固定的,因此为 0x1e2-0x1b8=42 字节。
- Offset 0x58:被拨号码的位数。这可能也是固定大小。
还有一些东西要找出来,但我会把它留给你。
作为最后的提示,使用类似 Kaitai struct (http://kaitai.io/) 的东西来编写二进制格式的 language-agnostic 定义,您可以从中生成各种语言的解析器。
所以我得到了这个面试任务,它看起来有点混乱。
我的工作是,我得到了几个二进制文件(例如联系人、电话等),我需要尽可能多地提取信息。
我使用 Hex Fiend(picture of hex fiend here) and i got a picture of how the calls should look like(picture of the calls here) 解码了二进制文件。
我的作业是用 C++ 编写的,我设法提取了 phone 数字和 "TO" 标签等信息,但所有其他数据似乎都无法读取为字符。它是否被编码为 ascii 消息,如 headers 的描述,标签应该在哪里,或者它应该是 corrupted/unreadable?
我应该也能提取日期和持续时间。
到目前为止,我已经解析了文件,所以当一个字符小于或等于 31 且大于或等于 127 时将其替换为空格,这样我就可以看到对应于实际数据的 letters/numbers就像 phone 个数字。
我解决这类问题的主要思路是弄清楚二进制的结构。
例如 01020304 可能是一个 header 表示这是一个日志并且有数据。
关于如何解决剩余问题的任何想法?
提前致谢!
此文件看起来包含 fixed-length 条记录,并且可以选择包含 header。 我计算了其中两个 EFCD 标记(0x34e 和 0x3b8)之间的距离,得出 106(或 0x6a)。尝试调整十六进制查看器的大小,使 106 成为准确的行数。
6360正好是106的倍数,所以好像没有header和footer
详细看一条记录。我选择了从 0x1a8 开始的那个,因为它有一些我们可以看的文本。
- 偏移量 0x00:对于其中一些标记而言似乎不同的某种序列号。我们不知道它有多大,所以我们现在猜测 4 个字节。
- 偏移量 0x04:对于大多数记录,这是 FF00 或 FF02。 2 个字节。
- 偏移量 0x06:几乎总是 FFFF,但并非总是如此。也是2个字节?
- Offset 0x0C:这有点像时间戳? 4 个字节
- 偏移量 0x10:终于,我们识别出了一些文本!看起来它在 UCS-2 中,中间有所有这些 00 字节。由于记录的大小是固定的,因此为 0x1e2-0x1b8=42 字节。
- Offset 0x58:被拨号码的位数。这可能也是固定大小。
还有一些东西要找出来,但我会把它留给你。 作为最后的提示,使用类似 Kaitai struct (http://kaitai.io/) 的东西来编写二进制格式的 language-agnostic 定义,您可以从中生成各种语言的解析器。