2011-02-10 39 views
5
var 
    FileBuff: TBytes; 
    Pattern: TBytes; 
begin 
    FileBuff := filetobytes(filename); 
    Result := CompareMem(@Pattern[0], @FileBuff[0], Length(Pattern)); 
end; 

Có chức năng nhưCó chức năng "Pos" nào để tìm byte không?

Result := Pos(@Pattern[0], @FileBuff[0]); 
+3

Pos là an toàn nhị phân, thức ăn nó với mảng của AnsiChar và thì đấy, công trình –

+0

Bạn cũng có thể quan tâm đến một Hàm StringReplace cho byte: http://stackoverflow.com/questions/3106139/binary-version-of-stringreplace –

Trả lời

7

Tôi nghĩ rằng đây có phải nó:

function BytePos(const Pattern: TBytes; const Buffer: PByte; const BufLen: cardinal): PByte; 
var 
    PatternLength: cardinal; 
    i: cardinal; 
    j: cardinal; 
    OK: boolean; 
begin 
    result := nil; 
    PatternLength := length(Pattern); 
    if PatternLength > BufLen then Exit; 
    if PatternLength = 0 then Exit(Buffer); 
    for i := 0 to BufLen - PatternLength do 
    if PByte(Buffer + i)^ = Pattern[0] then 
    begin 
     OK := true; 
     for j := 1 to PatternLength - 1 do 
     if PByte(Buffer + i + j)^ <> Pattern[j] then 
     begin 
      OK := false; 
      break 
     end; 
     if OK then 
     Exit(Buffer + i); 
    end; 
end; 
+0

Tôi sẽ sử dụng thông số chính thức thay vì pbyte. Có nghĩa là giống nhau, nhưng tương thích với nhiều loại hơn. –

+0

@Andreas, tôi nghĩ rằng nó không làm điều đó: Nếu mẫu không được tìm thấy, thường trình của bạn sẽ trả về một con trỏ đến byte đầu tiên ... làm thế nào bạn sẽ khác biệt nếu mẫu được tìm thấy ở byte đầu tiên? Không tìm thấy mẫu trả về nil tốt hơn trong trường hợp. Nếu byte đầu tiên và thứ hai của đối sánh mẫu, thường trình của bạn trả về địa chỉ của byte thứ hai và thoát (mà không cần so sánh phần còn lại của mẫu) – jachguate

+0

@jachguate: Tôi vừa thấy điều đó. –

0

Viết của riêng bạn. Không có tối ưu hóa có thể được thực hiện khi tìm kiếm chỉ một byte, vì vậy bất kỳ thực hiện bạn sẽ tìm thấy về cơ bản sẽ làm điều tương tự.

Viết trong trình duyệt:

function BytePos(Pattern:Byte; Buffer:PByte; BufferSize:Integer): Integer; 
var i:Integer; 
begin 
    for i:=0 to BufferSize-1 do 
    if Buffer[i] = Pattern then 
    begin 
     Result := i; 
     Exit; 
    end; 
    Result := -1; 
end; 
+1

Tôi nghĩ @user muốn khả năng của các mẫu nhiều byte –

+0

Có bạn chỉ tìm thấy một mẫu byte và yêu cầu là đa byte. –

+1

Bỏ phiếu có ý nghĩa một chút! Nó đã ở dưới đáy rồi! –

Các vấn đề liên quan