小编Ruc*_*cia的帖子

Delphi按位proc转换为PHP

我在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)

php delphi bit-manipulation

7
推荐指数
1
解决办法
836
查看次数

将德尔福风格的ASM翻译成英文?

我继承的最近的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)

delphi x86 assembly basm

5
推荐指数
1
解决办法
767
查看次数

标签 统计

delphi ×2

assembly ×1

basm ×1

bit-manipulation ×1

php ×1

x86 ×1