gpt4 book ai didi

php - Delphi 按位过程转换为 PHP

转载 作者:可可西里 更新时间:2023-11-01 12:59:22 24 4
gpt4 key购买 nike

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

我正在将它转换为 PHP,但结果不一样。这是我在 PHP 中得到的:

function HashElf($Buf, $BufSize){
$Bytes = str_split($Buf);

for ($i= 0; $i<$BufSize;$i++){
$Result = ($Result << 4) + Ord($Bytes[$i]);

$X = $Result & (0xF0000000);
if ($X<>0){$Result = $Result ^ ($X>>24);}

$Result = ($Result & (~ $X));
}
return $Result;
}

如果您将字符串 teststring 传递给 Delphi 函数,您将得到 195831015,但是 PHP 返回 72559895。我注意到只有在 7 个字符后差异才会变得明显。如果测试字符串只是测试结果是相同的。

PHP 似乎在将负整数向右移动时遇到一些困难,例如以下行:

 if ($X<>0){$Result = $Result ^ ($X>>24);}

更改为左移 $X<<24 为变量 X 生成与 Delphi 相同的值,但结果仍然不同。

我是否遗漏了一些非常明显的东西?

编辑:这两个函数的输出是:

德尔福

  Char: t   Result: 116        X: 0
Char: e Result: 1957 X: 0
Char: s Result: 31427 X: 0
Char: t Result: 502948 X: 0
Char: s Result: 8047283 X: 0
Char: t Result: 128756644 X: 0
Char: r Result: 181058242 X: 1879048192
Char: i Result: 212577321 X: -1610612736
Char: n Result: 180011582 X: -1073741824
Char: g Result: 195831015 X: -1610612736

PHP

  Char: t   $Result: 116         $X: 0
Char: e $Result: 1957 $X: 0
Char: s $Result: 31427 $X: 0
Char: t $Result: 502948 $X: 0
Char: s $Result: 8047283 $X: 0
Char: t $Result: 128756644 $X: 0
Char: r $Result: 181058242 $X: 1879048192
Char: i $Result: 212577417 $X: -1610612736
Char: n $Result: 180013310 $X: -1073741824
Char: g $Result: 195858503 $X: -1610612736

所以直到字符“i”,php 才开始偏离计算轨道

编辑2:

添加了 PHP 函数来执行逻辑右移而不是算术右移:

function lshiftright($var,$amt)
{
$mask = 0x40000000;
if($var < 0)
{
$var &= 0x7FFFFFFF;
$mask = $mask >> ($amt-1);
return ($var >> $amt) | $mask;
}else{
return ($var >> $amt);
}
}

这现在有效了!还要感谢 Ignacio 的面具创意 :)

最佳答案

你确定Delphi是对的而PHP是错的吗?

Delphi 的 shl 和 shr 显然在处理signed 整数时表现得无法预测。请参阅:http://www.merlyn.demon.co.uk/del-bits.htm#SAR . Stockton 博士似乎暗示有两种类型的移位操作:算术移位(保持符号)和逻辑移位。

文档 ( http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/expressions_xml.html ) 对 shl/shr 对有符号整数的影响不是很清楚。然而,他们确实提到对于 unsigned 整数,shr/shl 乘以 1 仅与 divions/乘以 2 相当。

我找不到 Stockton 博士(从第一个链接)所说的逻辑移位操作,但尝试更改 Delphi 实现以使用无符号 8 字节类型(DWORD 来mind) 看看有什么影响。

关于php - Delphi 按位过程转换为 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com