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

Тема в разделе "Delphi - Система", создана пользователем c0n, 8 май 2006.

Статус темы:
Закрыта.
  1. c0n

    c0n Гость

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

    zubr Гость

    Это что то новое - открыть файл в битах. Все что можно сделать - это открыть файл, побайтово читать его, и каждый байт преобразовывать в последовательность 0 и 1 и записывать в виде текста.
     
  3. c0n

    c0n Гость

    Я собственно это и имелл виду.
    Просто его надо преобразовать в биты. А точнее строку (массив) из бит всего файла. а потом работать с массивом. Размер этого файла более 100 МБ
     
  4. zubr

    zubr Гость

    Прочитай файл в буфер или в поток, а затем обрабатывай его побайтово. Вот тебе функция, преобразующая байт в строку, обозначающую биты '0' и '1'. Размер строки соответственно 8 байт.
    Код (Text):
    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;
     
  5. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Я бы так сказал что преобразование 100Мб файла целиком в битовую строку в памяти будет работать долго и займет минимум 1Гб оперативки. На мой взгляд задачу надо по другому решать - сделать процедуру поиска битовой последовательности в байтовом буфере, и частями с нахлестом загружать файл
     
  6. c0n

    c0n Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Гм. А ты хочешь файл в 100 мег обработать за пару секунд? На средней машине загрузка 100М в память + преобразовыние в строку займет тоже несколько минут, а уж если физической памяти меньше 2ГБ, то и все полчаса. Если важна скорость, то поиск битовый в байтах - самое быстрое решение, оптимизируй сам алгоритм поиска.
     
  8. zubr

    zubr Гость

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

    Barmutik Гость

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

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

    Или написать свой формат файла .. так называемого битового массива ... это будет быстрее.. у меня где-то есть пример.. но будет свой формат файла ...
     
  10. c0n

    c0n Гость

    Так, а это вообще возможно, загрузить такой файл в оперативу и бежать по нему?

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Да не надо тебе весь его в память грузить. Почитай про Memory mapped file - будет работать как с загруженным в память. А сделать все можно - это уже от твоих рук зависит :)
     
  12. zubr

    zubr Гость

    Для перескока есть функция API SetFilePointer (это если ты будешь через маппинг работать), а в потоках (Delphi классы TMemoryStream, TFileStream) есть метод Seek или свойство Position.
     
Загрузка...
Похожие Темы - Преобразование файла биты
  1. WolfEater
    Ответов:
    0
    Просмотров:
    787
  2. jager
    Ответов:
    1
    Просмотров:
    1.297
  3. PahaStar
    Ответов:
    0
    Просмотров:
    986
  4. PahaStar
    Ответов:
    0
    Просмотров:
    845
  5. ask40
    Ответов:
    0
    Просмотров:
    966
Статус темы:
Закрыта.

Поделиться этой страницей