Произвести поиск байта или слова в строке
Автор: http://sunsb.dax.ru
У семейства x86 есть группа специализированных строковых инструкций,
одна из которых - scasb/scasw - производит поиск байта/слова в строке.
Использовать преимущества этой инструкции в Delphi позволяют длинные строки,
которых в старых паскалях не было.
Никаких сложностей с пониманием, на мой взгляд, быть не должно.
Единственное это смена режима открытия файла (FileMode := 0),
которая позволит открыть файлы заблокированные ядром Windows
и сдвиг указателя файла
при чтении нового блока влево на длину искомой строки.
Сдвиг делается на случай разрезания искомой строки
на части при чтении файла.
Полный текст проверенной программы:
program search;
{$APPTYPE CONSOLE}
uses SysUtils;
const buffSize = 16384;
var F : File;
var buff : AnsiString;
var oldFileMode : integer;
var SearchString: shortString='SunSB';
var SearchPos : integer = -1;
var readed : integer;
var blockStart: integer;
begin
SetLength( buff, buffSize);
assignFile( F, 'Speedometer2.exe');
oldFileMode := FileMode;
FileMode := 0;
reset( F,1);
while not eof( F ) do begin
blockStart := filePos( F );
blockRead( F, buff[1], buffSize, readed);
SearchPos:=Pos( SearchString, buff );
if SearchPos > 0 then begin
WriteLn( 'Substr found at pos ',
blockStart+SearchPos );
break;
end;
if readed=buffSize then
seek( F, ( filePos( F ) -
length( SearchString )));
end;
closeFile( F );
FileMode := oldFileMode;
SetLength( buff, 0 );
if SearchPos = 0 then
WriteLn( 'Substr not found.');
readLn;
end.
|
|