0

我正在用 C 语言开发一个小项目,我必须解析一个未记录文件格式的二进制文件。由于我对 CI 很陌生,所以有两个问题要问一些更有经验的程序员。

第一个似乎很容易。如何从二进制文件中提取所有字符串并将它们放入数组中?基本上我正在寻找 C 中字符串程序的简单实现。

当我在任何文本编辑器中打开二进制文件时,我会得到很多垃圾,其中混入了一些可读的字符串。我可以在命令行中使用字符串提取这些字符串。现在我想在 C 中做类似的事情,就像下面的伪代码一样:

while (!EOF) {
     if (string found) {
          put it into array[i]
          i++
       }
     return i;
}

第二个问题稍微复杂一些,我相信它是实现相同目标的正确方法。当我在 HEX 编辑器中查看文件时,很容易注意到一些模式。例如,在每个字符串之前有一个值为 02 (0x02) 的字节,后跟字符串的长度和字符串本身。例如 02 18 52 4F 4F 54 4B 69 57 69 4B 61 4B 69是字符串部分以粗体显示的字符串。

现在我试图创建的功能将像这样工作:

while(!EOF) {
     for(i=0; i<buffer_size; ++i) {
          if(buffer[i] hex value == 02) {
               int n = read the next byte;
               string = read the next n bytes as char;
               put string into array;
          }
     }
}

感谢您的任何指示。:)

4

2 回答 2

1

第一个似乎很容易。如何从二进制文件中提取所有字符串并将它们放入数组中?

找出代表可打印 ASCII 字符的字符范围。遍历文件,检查字符是否为 ASCII 字符,并计算相邻的 ASCII 字符。默认情况下,strings会将四个或更多字符的序列视为字符串;当你找到下一个非 ASCII 字符时,检查是否超过了数字;如果有,输出字符串。一些簿记是必要的。

第二个问题稍微复杂一些,我相信它是实现相同目标的正确方法。

您的伪代码基本上是正确的。您可以手动将 的内容buffer[i]与整数(例如 2)进行比较。读取一个字节就像递增一样简单i。确保您没有超出缓冲区,并确保您读取字符串的数组足够大(如果 size 参数只有一个字节,您可以使用 255 长度的数组缓冲区。)

于 2011-03-07T02:15:43.370 回答
0

我不确定您的解决方案是否有效:如果您找到一个长度为 350 字符的字符串怎么办?数字可以是字符串的一部分,或者您可以将它们视为“垃圾”?

我认为最安全的方法是

  1. 定义你认为的字符串和你认为的“垃圾”——例如“:,!?” 是“字符串”还是“垃圾”?
  2. 定义被视为“可读”字符串的最小字符串长度
  3. 解析文件以查找长度 >= 最小值的每组字符。我知道,这很无聊,但我认为这是唯一安全的方法。祝你好运!
于 2011-03-07T02:17:53.983 回答