3

我有一些看起来像这样的 C# 代码:

uint a = 0x9E3779B9;
a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));

在该代码之后,a == 228 452 386

现在我正在尝试将此 C# 代码转换为 PHP,但在 PHP 中,数字不会以相同的方式溢出:

$a = 0x9E3779B9;
$a += ($url[$k+0] + ($url[$k+1] << 8) + ($url[$k+2] << 16) + ($url[$k+3] << 24));

在该代码之后, $a == 4 523 419 682

在这两种情况下,“url”都被视为 ascii 值的数组。在将 $a 添加到第二行的结果之前,返回相同的结果。那时,C# uint 溢出到约 2.28 亿。PHP 变得“聪明”并提出了“正确”的答案。

但我想要 C# 给出的溢出答案。我应该怎么办?

4

2 回答 2

5

添加 a$a &= 0xFFFFFFFF以在完成+=.

(见:http ://www.ideone.com/6BR0U )

于 2010-11-07T20:01:28.047 回答
0

已经有一段时间了,并且已经提交了一个有效的答案,但我只是想强调一种更简单的方法来执行您正在执行的解包:

$a = 0x9e3779b9;
$url = 'info';

$a = ($a + current(unpack('L', $url))) & 0xffffffff;

printf("%u\n", $a); // 228452387

unpack()用来执行从二进制到 uint32(机器字节顺序)的转换。在 32 位平台上,最终结果可能会变为负数,这就是为什么我也使用它printf()来正确格式化结果。

于 2013-09-03T02:29:19.920 回答