![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 06.08.2007
Сообщений: 2,183
|
![]()
Имеется некий бинарный файл, в нём нужно найти начало и конец блока для копирования, как нашли скопировать от начала маркера и до окончания второго маркера:
Код:
![]() Код:
Код:
|
![]() |
![]() |
![]() |
#2 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
А что, не работает? Или медленно? Как понять "криво"?
Копировать между потоками просто - Stream.CopyFrom. Поиск в принципе тоже ничего сложного, разве что со скоростью бывает не очень, я игрался с размером буфера для чтения кусков файла, желательно побольше его делать, я считывал по 512 или 2048 байт, если малый буфер то будет медленно очень за счет потерь времени на чтение с диска очередной партии данных. Если файл малый - то его можно сразу весь в память, в TMemoryStream, но тогда есть задержка на загрузку его, и если к примеру то что надо найдется в самом начале, то с чтением с диска было бы быстрее. Под каждый конкретный случай нужно подстраивать. Я бы эту процедуру так написал (позиция в потоке InFs выставляется в нужное место перед вызовом процедуры) Код:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 24.11.2009 в 20:15. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 06.08.2007
Сообщений: 2,183
|
![]()
Размер файла: от 40 до 200Мб
Сделал таким образом, работает как надо, но относительно медленно: Код:
Последний раз редактировалось Alter; 25.11.2009 в 17:46. |
![]() |
![]() |
![]() |
#4 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
Засекай время выполнения с помощью GetTickCount и оптимизируй поиск. Смотри внимательно в теле циклов, чтобы не было лишних проверок, лишних операций с памятью, размер блока считываемого в буфер попробуй увеличить, или уменьшить. В идеале поиск должен приближаться к простому последовательному считыванию данных с диска по скорости.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 26.11.2009 в 01:52. |
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 06.08.2007
Сообщений: 2,183
|
![]()
Сделал ещё одну, почти идентичную, функцию, где гружу в TMemoryStream. Ищет достаточно быстро, пара секунд
![]() Если например для поиска позиций маркеров в файле, использовать код отсюда http://www.programmersforum.ru/showp...19&postcount=5 Цитата:
|
|
![]() |
![]() |
![]() |
#6 | |||
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]() Цитата:
Если правильно настроить, то можно добиться при потоковом считывании практически такого же времени как и с предварительной загрузкой в память. Цитата:
В том коде используется буфер в 8 кб Цитата:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 26.11.2009 в 17:03. |
|||
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 06.08.2007
Сообщений: 2,183
|
![]()
Модифицирован под 8 Кб буфер, вроде быстро:
Код:
Код:
Код:
Последний раз редактировалось Alter; 29.11.2009 в 15:29. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Извлечение данных из потока | bug | Общие вопросы Delphi | 11 | 05.10.2009 14:34 |
вытащить текст UTF16 из бинарного файла | МОЛНИЯ | Помощь студентам | 1 | 04.01.2009 15:12 |
извлечение из своего тела exe файла | Titan123 | Общие вопросы Delphi | 4 | 22.10.2008 19:17 |
Извлечение данных из TCppWebBrowser | НикСерг | Общие вопросы C/C++ | 1 | 13.07.2008 17:16 |