【问题标题】:Read binary file, parse infos读取二进制文件,解析信息
【发布时间】:2015-12-11 16:10:23
【问题描述】:

我有一个二进制文件作为分析设备的输出。我知道它包含我需要的所有数据。我正在尝试从文件中提取它们。

借助这个问题:How to view files in binary in the terminal?

我用 Vim 打开文件,然后切换到二进制编辑。我现在可以浏览二进制文件。有些部分看起来很可读:

00000340: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000350: 0000 0000 0000 0000 0000 1a4c 0061 0062  ...........L.a.b
00000360: 0072 0061 0073 006f 006c 0020 0037 0030  .r.a.s.o.l. .7.0
00000370: 0067 004c 0020 0066 006c 0075 006f 0072  .g.L. .f.l.u.o.r
00000380: 0065 0073 0063 0065 0069 006e 0065 0000  .e.s.c.e.i.n.e..
00000390: 0000 0000 0000 0000 0000 0000 0000 0000  ................

但有些不是:

00001000: 4300 ea00 4b00 0000 d80e 401f 2800 5100  C...K.....@.(.Q.
00001010: 0400 0000 0000 6e03 36fe eaff b000 9cff  ......n.6.......
00001020: 71ff e500 0eff f9ff 4aff 1200 2cff c400  q.......J...,...
00001030: 6f00 6bff 0d00 c4ff f1ff fdff d9ff 6b00  o.k...........k.
00001040: f8ff 1c00 5400 34ff a600 deff feff beff  ....T.4.........
00001050: 1600 acff f5ff ffff 7600 39ff 5e00 9700  ........v.9.^...
00001060: 2a00 92ff 3300 94ff 5200 a2ff 6100 afff  *...3...R...a...
00001070: b9ff 3500 a1ff 2300 f6ff a000 f9fe ef00  ..5...#.........
00001080: c5ff 6000 2100 53ff 9200 8cff 9200 a0ff  ..`.!.S.........
00001090: 5d00 b0ff 8eff 8b00 30ff 0d01 adff 0300  ].......0.......
000010a0: 26ff ae00 cfff c000 6900 a2fe cc00 dfff  &.......i.......
000010b0: fdff 4fff b900 f0ff ba00 cdfe 2a00 3400  ..O.........*.4.
000010c0: 7cff f800 56ff c7ff 8100 3300 f7fe 6cff  |...V.....3...l.
000010d0: c500 3a00 0600 0500 8600 3800 56ff 1bff  ..:.......8.V...

我想知道我是否可以以结构化和清晰的方式提取数据。所以我有几个问题,我真的不知道从哪里开始:

  • 如果我可以清楚地阅读某些文本,我是否可以阅读文件中的其他数据?
  • 如何将测试解析为可用的方式?我

我知道我的问题有点不清楚。我主要需要一个起点。

我很乐意使用 Python 和 Bash 来完成这项任务。

这是文件的开头:

00000000: 0331 3331 0000 0000 0000 0000 0000 0000  .131............
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000f0: 0000 0000 0000 0005 0000 0083 0001 0005  ................
00000100: 0001 0001 0010 2232 0000 0009 0000 0000  ......"2........
00000110: 0000 0000 0000 0000 1195 0000 0000 0000  ................
00000120: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000130: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000140: 1000 0000 0001 0331 0033 0031 0000 0000  .......1.3.1....
00000150: 0000 0000 0000 0001 0000 000c 4c00 4300  ............L.C.
00000160: 2000 4400 4100 5400 4100 2000 4600 4900   .D.A.T.A. .F.I.
00000170: 4c00 4500 0000 0000 0000 0000 0000 0000  L.E.............
00000180: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000190: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................

编辑:

好的,现在我对二进制文件有了更多的了解。我会努力改进我的问题。

现在,我知道二进制文件是用某种结构(某种格式)编码的。所以,要解码它,你必须知道数据的结构。我不明白的是,对于二进制文件的某个部分,字符似乎不稳定。但是文件的开头是完全可读的。为什么 ?如果无法正确读取文件,如何尝试发现结构?

【问题讨论】:

  • 尝试使用命令strings file 甚至strings -e encoding file,其中的编码可能类似于utf16 或类似的。
  • 那里显然有 UTF-16 大端字符串。但是,我相信感兴趣的数据不会在这些文本字符串中。如果格式预期数据未知,则解码是相当不可能的
  • @JJoao:-e 选项不支持编码:-e --encoding={s,S,b,l,B,L} 选择字符大小和字节序:s = 7 -位,S = 8 位,{b,l} = 16 位,{B,L} = 32 位
  • @AnttiHaapala:我认为他们是。这是一个合理的猜测,看到了文件的大小。没有在相应目录中那么大。我不知道格式是什么,但我知道数据是什么。
  • 我不确定我是否真的明白你在问什么。我想我想提取字符串。如果更清楚,我想要以二进制编码的原始数据。我编辑了我的问题并添加了文件的开头。

标签: parsing binary binary-data


【解决方案1】:

在此期间,该问题可能与其所有者失去了相关性。但是,仍然需要一点点接触才能给出在类似情况下找到解决方案的想法。

只要知道创建文件时使用的结构,任何类型的二进制文件都可以解析为有意义的数据。然后需要使用任何已知语言的解析器来读取文件内容以获取数据。如果没有合适的解析器,则需要学习如何使用文件工具解析该数据。如果需要,在文件操作中寻找“offset”和“seek”之类的词。

如果结构未知,但用户可以使用该程序,则可以使用它来创建新的数据文件,只需对数据本身进行少量更改,例如更改名称中的字符或将值增加 1 . 然后可以比较这些新文件(作为二进制文件)以查找哪些字节已更改。在这些情况下,不需要映射所有数据块。相反,只知道基本块就足够了。之后,其余与上段相同。

一个示例文件结构: 假设您已将您的姓名、年龄和体重写入文件。如果我将它作为文本数据内容写入文件,二进制模式下将是“YILMAZ4078.5”或“YILMAZ(B”。在文本模式下,很容易构造一个结构,但二进制文件需要更优雅的触摸,即一个很长的话题。如果块是整数或实数等,只需计算字节数就足够了。

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多