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

¿Hay alguna función, como¿Hay alguna función "Pos" para encontrar los bytes?

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

Pos es seguro binario, alimentarlo con matrices de AnsiChar y listo, funciona –

+0

También podría estar interesado en una Función StringReplace para bytes: http://stackoverflow.com/questions/3106139/binary-version-of-stringreplace –

Respuesta

7

Creo que esto lo hace:

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

Usaría un parámetro formal en lugar de pbyte. Significa lo mismo, pero es compatible con más tipos. –

+0

@Andreas, creo que no lo hace: si no se encuentra el patrón, su rutina devolverá un puntero al primer byte ... ¿cuál sería la diferencia si el patrón se encuentra en el primer byte? Mejor retorno nulo en caso de que no se encuentre el patrón. Si el primero y el segundo byte del patrón coinciden, su rutina devuelve la dirección de ese segundo byte y sale (sin más comparaciones con el resto del patrón) – jachguate

+0

@jachguate: Acabo de ver eso. –

0

Escribe tu propia. No se puede optimizar cuando se busca solo un byte, por lo que cualquier implementación que se encuentre básicamente hará lo mismo.

Escrito en el navegador:

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

Creo @user quiere capacidad de patrones de varios bytes –

+0

Sí, solo se encuentra un patrón de bytes, y el requisito es multi- byte. –

+1

¡El voto a la baja fue un poco cruel! ¡Ya estaba abajo! –

Cuestiones relacionadas