快速找到字节数组中的 DWORD 位置 delphi
Fast find a DWORD position in array of byte delphi
寻找在字节数组中查找双字的最快方法
例如,我有这个双字。我实现了一个方法但是它很慢,因为我将字节数组转换为十六进制字符串并将双字搜索为字符串,转换占用了大部分时间!!
need to find pos of this dword --> 01 49 08 EF 48 C0 C6 91
var
myarray:array of byte;
p:integer;
begin
p:= pos('014908EF48C0C691',array2hex(myarray));
end;
我需要在不进行转换的情况下在字节数组中找到双字快速搜索的位置!
一个DWORD
是4个字节,所以01 49 08 EF 48 C0 C6 91
作为一个DWORD
太大了。它要么是 2 DWORD
个值,要么是一个 (U)Int64
.
但无论哪种方式,将数组转换为 string
绝对是错误的方法。只需搜索原始数组数据 as-is 即可,例如:
const
bytesToFind: array[0..7] of Byte = (, , , $EF, , $C0, $C6, );
var
myarray: array of byte;
I, FoundAtIndex, Len: integer;
begin
myarray := ...;
Len := Length(myarray);
FoundAtIndex := -1;
for I := 0 to Len-8 do
begin
if (myarray[I] = ) and
((I+8) <= Len) and
CompareMem(@myarray[I], @bytesToFind, 8) then
begin
FoundAtIndex := I;
Break;
end;
end;
if FoundAtIndex <> -1 then
begin
// use FoundAtIndex as needed...
end else
begin
// not found...
end;
end;
寻找在字节数组中查找双字的最快方法
例如,我有这个双字。我实现了一个方法但是它很慢,因为我将字节数组转换为十六进制字符串并将双字搜索为字符串,转换占用了大部分时间!!
need to find pos of this dword --> 01 49 08 EF 48 C0 C6 91
var
myarray:array of byte;
p:integer;
begin
p:= pos('014908EF48C0C691',array2hex(myarray));
end;
我需要在不进行转换的情况下在字节数组中找到双字快速搜索的位置!
一个DWORD
是4个字节,所以01 49 08 EF 48 C0 C6 91
作为一个DWORD
太大了。它要么是 2 DWORD
个值,要么是一个 (U)Int64
.
但无论哪种方式,将数组转换为 string
绝对是错误的方法。只需搜索原始数组数据 as-is 即可,例如:
const
bytesToFind: array[0..7] of Byte = (, , , $EF, , $C0, $C6, );
var
myarray: array of byte;
I, FoundAtIndex, Len: integer;
begin
myarray := ...;
Len := Length(myarray);
FoundAtIndex := -1;
for I := 0 to Len-8 do
begin
if (myarray[I] = ) and
((I+8) <= Len) and
CompareMem(@myarray[I], @bytesToFind, 8) then
begin
FoundAtIndex := I;
Break;
end;
end;
if FoundAtIndex <> -1 then
begin
// use FoundAtIndex as needed...
end else
begin
// not found...
end;
end;