2012-04-04 24 views
3

如果使用FreePascal(或Delphi,如果沒有FP示例),給定一個2048字節的緩衝區作爲「字節數組」,如何在緩衝區中搜索「StringA」?如何搜索「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"? 
... 

三江源

回答

6

我認爲這將在FPC工作,而無需額外的Unicode/AnsiString類型轉換:

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; 
+0

+1寧可在我看來 – 2012-04-04 21:14:15

+0

謝謝再次LURD。這很有效,很容易理解!它確實有效。我唯一的問題(也是另一個問題)是,返回的偏移量值當然是每個緩衝區段的值,並且與原始源文件中找到的位置無關。因此,如果第一次碰撞位於源文件和第一次讀取的緩衝區內,則匹配源文件的偏移量。但在此之後,它與緩衝區相關,並且與原始源文件偏移量不相似。我會考慮這一點。再次感謝! – 2012-04-04 21:29:40

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,但我期望這將工作不變,如果不是,那麼我相信你可以轉換它。

+1

FPC還具有一個字節的搜索,體系結構無關的原始稱爲「indexbyte」。這可以用來搜索第一個字節,然後纔可以執行comparemem。它是通用實現的基礎。 POS() – 2012-04-06 09:23:01