3

FreePascal (または FP の例がない場合は Delphi) を使用して、「バイトの配列」としての 2048 バイトのバッファーが与えられた場合、バッファーで「StringA」を検索するにはどうすればよいですか?

var
Buffer : array[1..2048] of byte;
...
  repeat
      i := 0;
      BlockRead(SrcFile, Buffer, SizeOf(Buffer), NumRead);      
      // Now I want to search the buffer for "StringA"? 
...

ありがとうございました

4

2 に答える 2

6

これは、追加の Unicode/AnsiString 変換なしで fpc で機能すると思います。

function Find(const buf : array of byte; const s : AnsiString) : integer;
//returns the 0-based index of the start of the first occurrence of S
//or -1 if there is no occurrence
var
  AnsiStr : AnsiString;
begin
  SetString(AnsiStr, PAnsiChar(@buf[0]), Length(buf));
  Result := Pos(s,AnsiStr) - 1;  // fpc has AnsiString overload for Pos()
end;
于 2012-04-04T21:08:56.457 に答える
4

これは単純なアプローチであり、目的の文字列を探すためにバッファをバイト単位で単純に調べます。

function Find(const Buffer: array of Byte; const S: AnsiString): Integer;
//returns the 0-based index of the start of the first occurrence of S
//or -1 if there is no occurrence
var
  N: Integer;
begin
  N := Length(S);
  if N>0 then
    for Result := low(Buffer) to high(Buffer)-(N-1) do
      if CompareMem(@Buffer[Result], Pointer(S), N) then
        exit;
  Result := -1;
end;

私は FPC を使用していませんが、これは変更されずに動作すると予想されます。そうでない場合は、変換できると確信しています。

于 2012-04-04T20:35:30.953 に答える