Извлечение строк из двоичных файлов в VB.Net - PullRequest
1 голос
/ 03 декабря 2009

Я хочу очистить строковые данные от некоторых двоичных текстовых файлов, которые содержат встроенные операторы SQL. Мне не нужна какая-то необычная очистка - просто какой-то способ извлечь читаемый текст. Я использую vb.net, но вызов внешней утилиты тоже будет работать.

Ответы [ 4 ]

3 голосов
/ 04 декабря 2009
3 голосов
/ 04 декабря 2009

Утилита GNU strings существует всегда и более-менее точно делает это, используя эвристику для извлечения любых данных, которые «похожи на строки», из двоичного файла.

Загрузите GNU binutils (включая строки) для Win32 из MinGW: http://sourceforge.net/projects/mingw/files/.

1 голос
/ 03 декабря 2009

Это не так тривиально, как может показаться на первый взгляд. Строка может быть закодирована разными способами. Что вы считаете «читабельным текстом», как выглядят нечитаемые части? Скажем, это выглядит так:

 &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: анализ данных этого типа может быть сложным, это очень поможет, если вы сможете загрузить свой файл куда-нибудь, чтобы мы могли посмотреть.

0 голосов
/ 04 декабря 2009

Спасибо всем. Отличные идеи Действительно помог мне подумать. Проголосует все вокруг. В итоге мне не нужно было быть очень уверенным, что они были струнами, поэтому я пошел с быстрым, неаккуратным, безобразным хаком.

 '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)
...