0
<?
    class int64{
        var $h;
        var $l;
        function int64($h, $l)
        {
            $this->h = $h;
            $this->l = $l;
        }
    }
    function int64rrot(int64 $dst, int64 $x, $shift)
    {
        $dst->l = ($x->l >> $shift) | ($x->h << (32-$shift));
        $dst->h = ($x->h >> $shift) | ($x->l << (32-$shift));
        print_r($dst);
    }
    $a =  new int64(1779033703,-205731576);
    $b =  new int64(1779033701,-205731572);
    int64rrot($a,$b,19);
?>
<script type="text/javascript">
    function int64rrot(dst, x, shift)
    {
        dst.l = (x.l >>> shift) | (x.h << (32-shift));
        dst.h = (x.h >>> shift) | (x.l << (32-shift));
        console.log(dst);
    }
    function int64(h, l)
    {
      this.h = h;
      this.l = l;
    }
    a =  new int64(1779033703,-205731576);
    b =  new int64(1779033701,-205731572);
    int64rrot(a,b,19);
</script>

屏幕输出(通过 PHP :)

int64 Object ( [h] => -1725854399 [l] => -393 ) 

控制台中的输出(通过 Javascript)(正确的一个):

int64 { h=-1725854399, l=1020051063}

我一整天都在努力纠正。但不能。我需要在 PHP 代码中进行哪些修改才能获得 javascript 的答案?

我想使用 php 获取 javascript 输出

4

3 回答 3

1

>>> logical rightshift在 JavaScript 中使用了 php 中不可用的运算符。这就是它导致错误的原因。

你这样做:

function zeroRs($a,$n){
    if($n<=0) return $a;
    $b= 0x80000000;
    return ($a >> $n) & ~($b >> ($n-1));
}

现在代替$x->l >> $shiftdo zeroRs($x->l, $shift)。这应该工作!

于 2012-10-24T12:46:28.063 回答
1

您在 JavaScript 中使用了 >>> 运算符。这意味着逻辑右移。PHP没有这个,这是错误。

要获得相同的输出:

将 JavaScript 中的运算符从 '>>>' 更改为 '>>'

在 PHP 中实现逻辑右移函数。

于 2012-10-23T11:23:58.073 回答
0

我从未见过像>>>JavaScript 那样的运算符。也许这就是错误。

运营商的使用方式有所不同。

>>>有关vs的详细信息,请参阅 MDN 文档>>

代替:

x.l >>> shift

尝试:

x.l >> shift
于 2012-10-23T11:21:39.707 回答