разбор бинарного файла в C#

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

как лучше всего разобрать полный файл ... или мне следует сделать это в двоичной форме. Я использую vs-2005.


person Royson    schedule 01.12.2009    source источник
comment
Какой тип значений вы пытаетесь найти?   -  person o.k.w    schedule 01.12.2009
comment
значения могут быть любой строкой, числом или символом. я хочу найти его положение в файле.   -  person Royson    schedule 01.12.2009


Ответы (3)


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

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

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

person Groo    schedule 01.12.2009

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

person deerchao    schedule 01.12.2009
comment
я не знаю значение байта строки поиска. - person Royson; 01.12.2009
comment
Преобразование строки в Byte[] с помощью Encoding.GetBytes(); Используйте оператор сдвига (‹‹ или ››) для преобразования целых чисел в байты; - person deerchao; 01.12.2009

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

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

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

person RA.    schedule 01.12.2009