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

Материал из DRKB

Произвести поиск байта или слова в строке[править | править код]

У семейства 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.

Source: http://sunsb.dax.ru