有关在C++中解析二进制文件的问题

Question about parsing a binary file in C++

本文关键字:二进制文件 问题 C++      更新时间:2023-10-16

所以我得到了这个面试作业,这似乎有点令人困惑。

我的工作是,我得到了几个二进制文件(例如联系人,电话等(,我需要提取尽可能多的信息。

我使用十六进制恶魔解码了二进制文件(十六进制恶魔的图片在这里(,我得到了调用应该是什么样子的图片(这里的调用图片(。

我的任务是C++,我设法提取了电话号码和"TO"标签等信息,但所有其他数据似乎都无法作为字符读取。它是否编码为 ascii 消息,例如标头的描述,标签应该在哪里,或者它应该损坏/不可读?

我也应该能够提取日期和持续时间。

到目前为止,我已经解析了该文件,因此当一个字符小于或等于 31 并且大于或等于 127 时将其替换为空格,以便我可以看到对应于实际数据的字母/数字,例如电话号码。

我解决这类问题的主要想法是弄清楚二进制文件的结构。

例如,01020304可能是一个标头,表示这是一个日志并且有数据。

关于如何解决其余问题的任何想法?

提前感谢!

此文件看起来像是包含固定长度的记录,可以选择带有标头。 我测量了其中两个EFCD标记(0x34e和0x3b8(之间的距离,得出了106(或0x6a(。尝试调整十六进制查看器的大小,使 106 是确切的行数。

6360 是 106 的精确倍数,因此似乎没有页眉或页脚。

让我们详细看一下记录。我选择了从0x1a8开始的那个,因为它有一些我们可以查看的文本。

  • 偏移0x00:对于其中一些标记,某种序列号似乎有所不同。我们不知道它有多大,所以现在让我们猜 4 个字节。
  • 偏移量0x04:对于大多数记录,这是 FF00 或 FF02。 2 字节。
  • 偏移0x06:几乎总是FFFF,但并非总是如此。还有 2 个字节?
  • 偏移量0x0C:这隐约看起来像时间戳? 4 字节
  • 偏移0x10:最后,我们认识一些文字!看起来它在 UCS-2 中,中间有所有这些 00 字节。由于记录的大小是固定的,因此为 0x1e2-0x1b8=42 字节。
  • 偏移0x58:所拨号码的数字。这可能也是固定大小。

还有一些东西需要找出来,但我会把它留给你。 作为最后一个提示,使用 Kaitai struct (http://kaitai.io/( 之类的东西来编写二进制格式的与语言无关的定义,您可以从中生成各种语言的解析器。