Преобразование файла в биты и работа с ними

  • Автор темы c0n
  • Дата начала
Статус
Закрыто для дальнейших ответов.
C
#1
Задачка такова.
Надо открыть файл достаточно большим размером. Да не просто открыть, а открыть его в битах. Затем (или по ходу) необходимо эту последовательность записать куданить, к примеру в переменную типа ansistring имеющую размер до 2 ГГб.
Затем нужно найти определённую комбинацию битов в поседовательности.
Кто знает как это сделать?
 
Z

zubr

#2
Это что то новое - открыть файл в битах. Все что можно сделать - это открыть файл, побайтово читать его, и каждый байт преобразовывать в последовательность 0 и 1 и записывать в виде текста.
 
C
#3
Я собственно это и имелл виду.
Просто его надо преобразовать в биты. А точнее строку (массив) из бит всего файла. а потом работать с массивом. Размер этого файла более 100 МБ
 
Z

zubr

#4
Прочитай файл в буфер или в поток, а затем обрабатывай его побайтово. Вот тебе функция, преобразующая байт в строку, обозначающую биты '0' и '1'. Размер строки соответственно 8 байт.
Код:
function ByteToBin(bt:byte):String;
var
i:Integer;
b:byte;
begin
Result:='';
For i:=7 downto 0 do
begin
b:=bt shr i;
b:=b and $1;
If b=1 then
Result:=Result+'1'
else
Result:=Result+'0';
end;
end;
 

grigsoft

Well-known member
15.11.2005
735
0
#5
Я бы так сказал что преобразование 100Мб файла целиком в битовую строку в памяти будет работать долго и займет минимум 1Гб оперативки. На мой взгляд задачу надо по другому решать - сделать процедуру поиска битовой последовательности в байтовом буфере, и частями с нахлестом загружать файл
 
C
#6
Я уже так пробовал. Дело в том, что обработка действительно занимает достаточно длительно время. Вплото до нескольких минут. А надо сделать быстрее. По частям как нистранно тож не получается, обрботка идет, а вот скорость конечно тоже оставляет желать лучшего.
 

grigsoft

Well-known member
15.11.2005
735
0
#7
Гм. А ты хочешь файл в 100 мег обработать за пару секунд? На средней машине загрузка 100М в память + преобразовыние в строку займет тоже несколько минут, а уж если физической памяти меньше 2ГБ, то и все полчаса. Если важна скорость, то поиск битовый в байтах - самое быстрое решение, оптимизируй сам алгоритм поиска.
 
Z

zubr

#8
Быстрее будет, если не преобразовывать байты в битовую строку, а сравнивать каждый байт с битовой маской операцией and.
 
B

Barmutik

#9
Правильно предлагают ...

Открывать в Stream файл и далее по нему уже бежать и искать маску...

Или написать свой формат файла .. так называемого битового массива ... это будет быстрее.. у меня где-то есть пример.. но будет свой формат файла ...
 
C
#10
Так, а это вообще возможно, загрузить такой файл в оперативу и бежать по нему?

Хорошо. А если эта комбинация, которая у нас есть повторяется в файле с определённой переодичностью , можем ли мы сделать так, чтобы происходил поиск её, а затем перескок на определённое количество вперёёд и снова сравнение. (только надо вставить провеку на сравнение комбинаций (действительно это та комбинация или нет) если нет пару сдвигов вправо, влево и снова сравнение (это для того чтобы не потерять начало)) и бежать так записывая количество появившихся комбинаций.
 

grigsoft

Well-known member
15.11.2005
735
0
#11
Да не надо тебе весь его в память грузить. Почитай про Memory mapped file - будет работать как с загруженным в память. А сделать все можно - это уже от твоих рук зависит :)
 
Z
#12
Для перескока есть функция API SetFilePointer (это если ты будешь через маппинг работать), а в потоках (Delphi классы TMemoryStream, TFileStream) есть метод Seek или свойство Position.
 
Статус
Закрыто для дальнейших ответов.