:: Visual Foxpro, Foxpro for DOS
Поиск строки в бинарном файле
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Есть задача - найти смещение (номер байта от начала файла) в бинарном (двоичном) файле. Функция AT не подходит, т.к. предназначена для текста и текстовых файлов и выдаст неверное смещение строки с текстом в бинарном файле. К тому же функция AT не работает со строками, длина которых превышает 64 Kb. На VFP не создашь TMemoryStream с последующим вызовом CompareMem для значения Searchbuffer, как на Delphi. Остается смотреть в сторону функций C++, таких как memchr - Locate character in block of memory? Никто не пробовал обращаться из фокса к этой функции, предварительно описав её, как внешнюю из библиотеки msvcr70:
DECLARE INTEGER memchr IN msvcr70 string@,integer,integer
Хотелось бы посмотреть пример обращения к этой функции из VFP...
А может быть будут какие-то другие мысли, чем заменить функцию AT для поиска смещения строки (или определенного набора байтов) в бинарном файле? Хотелось бы найти самое простое решение.



Исправлено 1 раз(а). Последнее : rvc44, 22.03.20 21:48
Ratings: 0 negative/0 positive
Re: Поиск строки в бинарном файле
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Вот эта тема forum.foxclub.ru натолкнула на мысль использовать CreateBinary.
Ratings: 0 negative/0 positive
Re: Поиск строки в бинарном файле
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Еще бы понять, как преодолеть лимит в 64 Kb? Размер бинарного файла составляет до 5 Мб. Может разбивать его на части с помощью ALines? Или всё-таки использовать memchr или что-то другое? Может быть читать с помощью API-функции ReadFile блоками по 64 Kb?



Исправлено 3 раз(а). Последнее : rvc44, 22.03.20 23:11
Ratings: 0 negative/0 positive
Re: Поиск строки в бинарном файле
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Горе от ума, называется...
lcContent = FILETOSTR(GETENV("windir")+"\explorer.exe")
? LEN(m.lcContent)/1024/1024
* ~4.4Мб размер файла. до 16 мб вообще никаких вопросов не возникает - а так FILETOSTR
* и большие файлы может затянуть в переменную. не переменная, так в мемо поле (бинарное)
* можно загрузить, или blob если фокс 9-й - там ограничение чуть меньше 2Гб.
lcSearchFor = STRCONV("560053005f005600",16)
* кусочек юникодного текста VS_V - таких байтиков в файле есть
* две последовательности - по крайней мере у меня на Win10
? AT(m.lcSearchFor, m.lcContent)
* ~2920569 - первое вхождение - гораздо дальше 64Кб.
? AT(m.lcSearchFor, m.lcContent, 2)
* ~4551055 - второе вхождение, близко к концу файла.
? SUBSTR(m.lcContent, AT(lcSearchFor, m.lcContent), 200)
* показывает соответствующий найденный кусок файла (200 байт)


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 23.03.20 00:03
Ratings: 0 negative/1 positive
Re: Поиск строки в бинарном файле
rvc44
Автор

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Действительно, проще не бывает! Меня смутило то, что в 16-ричном виде смещение не совпало на несколько байтов, но по факту вырезает всё как надо. Спасибо. Fox воистину крут! Наконец-то я доделал парсинг MTOM-вложений в СМЭВ 3.xx



Исправлено 1 раз(а). Последнее : rvc44, 23.03.20 03:07
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика