1

我想从一些包含嵌入式 SQL 语句的二进制文本文件中抓取字符串数据。我不需要任何花哨的清理——只是一些提取可读文本的方法。我正在使用 vb.net,但调用外部实用程序也可以。

4

4 回答 4

3

供参考: http ://technet.microsoft.com/en-us/sysinternals/bb897439.aspx

于 2009-12-03T21:21:40.907 回答
3

GNU 字符串实用程序一直存在,并且通过使用启发式方法从二进制文件中提取任何“看起来像字符串”的数据,或多或少地做到了这一点。

从 MinGW 获取 Win32 的 GNU binutils(包括字符串):http: //sourceforge.net/projects/mingw/files/

于 2009-12-03T21:45:11.237 回答
1

这并不像起初看起来那么微不足道。字符串可以通过多种方式进行编码。您认为“可读文本”是什么,不可读的部分看起来如何?说它看起来像这样:

 &8)JÓxZZ`\■£ÌS?E?L?E?C?T?*?F?R?O?M?m?y?T?b?l?§ıÍ4¢

你很幸运,因为它很可能使用 UTF-16 或其他多字节编码进行编码。这些是相当微不足道的识别。但在几乎所有其他情况下(UTF-8、ISO-8859-1、Windows-1252),几乎不可能区分单个字符是文本还是非文本,除非您非常了解某个字符“可读文本”开始以及如何结束。

关键是:任何东西都是允许的,并且被认为是可读的文本。UTF-8、ASCII 和 Windows-1252 甚至允许 NULL 字符(而某些编程语言则不允许)。这是一个线程,它提供了一个如何进行的 VB 示例,它可能会给你一些提示。

PS:分析这种类型的数据可能很困难,如果您可以将文件上传到某个地方以便我们查看,这将有很大帮助。

于 2009-12-03T20:48:54.757 回答
0

谢谢大家。伟大的想法。真的帮助我思考。到处点赞。最后,我不需要非常确定它们是字符串,所以我使用了一个快速、草率、丑陋、hack 的方法。

 'strip out non-string characters 
 For Each b As Byte In byteArray
      If b = 9 Or b = 10 Or b = 13 Or (b > 31 And b < 127) Then
          newByteArray(i) = b.ToString
          i += 1
      End If
  Next

  'move it into a string
  resultString = System.Text.Encoding.ASCII.GetString(newByteArray)
于 2009-12-03T22:15:19.570 回答