Произвести поиск байта или слова в строке

Previous  Top  Next

    
 

У семейства x86 есть группа специализированных строковых инструкций, одна из которых - scasb/scasw - производит поиск байта/слова в строке. Использовать преимущества этой инструкции в Delphi позволяют длинные строки, которых в старых паскалях не было.

 

Никаких сложностей с пониманием, на мой взгляд, быть не должно. Единственное это смена режима открытия файла (FileMode := 0), которая позволит открыть файлы заблокированные ядром Windows и сдвиг указателя файла при чтении нового блока влево на длину искомой строки. Сдвиг делается на случай разрезания искомой строки на части при чтении файла. Полный текст проверенной программы:

 

 

Code:

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.

 

 

http://sunsb.dax.ru