парсинг двоичного файла в C # - PullRequest
1 голос
/ 01 декабря 2009

У меня есть бинарный файл. я сохранил его в байтовом массиве. Размер файла может быть 20 МБ или более. тогда я хочу разобрать или найти конкретное значение в файле. я делаю это двумя способами -> 1. Конвертируя полный файл в массив char. 2. Путем преобразования полного файла в шестнадцатеричную строку. (У меня также есть шестнадцатеричные значения)

что является лучшим способом для анализа полного файла .. или я должен сделать в двоичном виде. Я использую VS-2005.

Ответы [ 3 ]

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

Что мешает вам искать в байте []? ИМХО, если вы просто ищете байт указанного значения или несколько непрерывных байтов, это самый простой и эффективный способ сделать это.

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

Если я правильно понял ваш вопрос, вам нужно найти строки, которые могут содержать любые символы в большом двоичном файле. Содержит ли двоичный файл текст? Если да, знаете ли вы кодировку? Если это так, вы можете использовать класс StreamReader следующим образом:

using (StreamReader sr = new StreamReader("C:\test.dat", System.Text.Encoding.UTF8))
{
    string s = sr.ReadLine();
}

В любом случае, я думаю, гораздо эффективнее использовать потоковый доступ к файлу, а не загружать его в память. Вы можете загрузить его частями в память, а затем использовать какой-либо алгоритм сопоставления с образцом (например, Кнут-Морис-Пратт или Карп-Рабин)

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

С точки зрения потребления памяти, было бы лучше, если бы вы могли анализировать ее напрямую, на лету.

Преобразование его в массив символов в C # означает эффективное удвоение его размера в памяти (при условии, что вы конвертируете каждый byte в char), в то время как шестнадцатеричная строка будет принимать по крайней мере 4 раза больше (символы C # равны 16 -битные символы Юникода).

С другой стороны, если вам нужно многократно выполнять поиск и анализ существующего набора данных, вам может быть полезно хранить его в любой форме, которая лучше соответствует вашим потребностям.

...