我在Delphi中有一个相当简单的函数,它接受一个字符串并根据该字符串产生一个散列整数:
function TfrmMain.HashElf(const Buf; BufSize : LongInt) : LongInt;
var
Bytes : TByteArray absolute Buf;
I, X : LongInt;
begin
Result := 0;
for I := 0 to BufSize - 1 do begin
Result := (Result shl 4) + Bytes[I];
X := Result and $F0000000;
if (X <> 0) then Result := Result xor (X shr 24);
Result := Result and (not X);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我正在将它转换为PHP,但结果并不相同.这是我在PHP中得到的:
function HashElf($Buf, $BufSize){
$Bytes = str_split($Buf);
for ($i= 0; $i<$BufSize;$i++){
$Result = ($Result << …Run Code Online (Sandbox Code Playgroud) 我继承的最近的Delphi项目在ASM中有一个过程.我是一个完整的ASM新手,所以我不明白.我已经阅读了各种ASM指令,试图解读程序流程,但我仍然没有得到它.
有ASM经验的人可以帮助我理解并将以下程序翻译成英语(然后我可以翻译成Delphi,以便将来更容易阅读代码!!!)
Mem1的声明是Byte的数组[0..15]; .而内存2是LONGINT.
这是程序:
procedure TForm1.XorMem(var Mem1; const Mem2; Count : Cardinal); register;
begin
asm
push esi
push edi
mov esi, eax //esi = Mem1
mov edi, edx //edi = Mem2
push ecx //save byte count
shr ecx, 2 //convert to dwords
jz @Continue
cld
@Loop1: //xor dwords at a time
mov eax, [edi]
xor [esi], eax
add esi, 4
add edi, 4
dec ecx
jnz @Loop1
@Continue: //handle remaining bytes (3 or less)
pop …Run Code Online (Sandbox Code Playgroud)