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

Kendi yaz böyleBaytları bulmak için herhangi bir "Pos" işlevi var mı?

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

Pos ANSIChar dizileri ile beslemek, ikili güvenlidir ve işte, –

+0

Ayrıca ilginizi çekebilir işleri Bayt için StringReplace işlevi: http://stackoverflow.com/questions/3106139/binary-version-of-stringreplace –

cevap

7

: tarayıcıda Yazılı

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

Pbyte yerine resmi bir parametre kullanırdım. Aynı anlamına gelir, ancak daha fazla tür ile uyumludur. –

+0

@Andreas, sanırım bunu yapmaz: Desen bulunmazsa, rutininiz ilk bayta bir işaretçi döndürür ... Kalıp ilk baytta bulunursa nasıl fark edersiniz? Durum deseninde daha iyi dönüş yok. Kalıbın birinci ve ikinci baytı eşleşirse, rutininiz ikinci baytın adresini döndürür ve çıkar (desenin geri kalanını daha fazla karşılaştırmadan) – jachguate

+0

@jachguate: Bunu daha yeni gördüm. –

0

olarak bir fonksiyon var mıdır. Tek bir bayt ararken hiçbir optimizasyon yapılamaz, bu nedenle, bulacağınız herhangi bir uygulama temelde aynı şeyi yapar. Bu öyle düşünüyorum

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

Sanırım, çok baytlı desenler için –

+0

yeteneğini istiyor Evet, yalnızca bir bayt deseni buluyorsunuz ve gereksinim çok bayt. –

+1

Aşağı oylama biraz kaba! Zaten dipte idi! –

İlgili konular