【问题标题】:How to force PHP to treat a number like a uint如何强制 PHP 将数字视为 uint
【发布时间】:2011-05-06 09:16:03
【问题描述】:

我有一些看起来像这样的 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# 给出的溢出答案。我该怎么办?

【问题讨论】:

    标签: c# php overflow uint32 uint


    【解决方案1】:

    添加$a &amp;= 0xFFFFFFFF 以在完成+= 后将值放回32 位范围内。

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

    【讨论】:

      【解决方案2】:

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

      $a = 0x9e3779b9;
      $url = 'info';
      
      $a = ($a + current(unpack('L', $url))) & 0xffffffff;
      
      printf("%u\n", $a); // 228452387
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多