【问题标题】:PHP XOR operation two numbersPHP XOR 操作两个数字
【发布时间】:2014-01-25 01:10:29
【问题描述】:

我正在尝试异或两个值,如下所示:

变量 1:6463334891 变量 2:1000212390

当我在 php 中对这些值进行异或运算时,它给了我错误的答案。

它应该给我“7426059853”

这是我的代码

 $numericValue = (int)$numericValue;
 $privateKey = (int)$privateKey;
 echo  "Type of variable 1 ".gettype($numericValue)."<br />";
 echo  "Type of variable 2 ".gettype($privateKey)."<br />";
 $xor_val = (int)$numericValue ^ (int)$privateKey;
 echo "XOR Value :".$xor_val."<br />";

【问题讨论】:

  • 确实如此:3v4l.org/JuhIF
  • 你用了什么代码?你得到了什么结果?
  • var_dump(6463334891 ^ 1000212390); //显示7426059853
  • 我现在用我的代码更新帖子。
  • 如果我们不知道这些变量的值是什么,那么更新就毫无意义了。

标签: php xor


【解决方案1】:

只是彻底陷入黑暗......

你正在这样做:

echo "6463334891" ^ "1000212390";

当你想这样做时:

echo 6463334891 ^ 1000212390;

XOR 是对字节的操作。整数6463334891 和字符串"6463334891" 的字节表示非常不同。因此,根据操作数是字符串还是整数,此操作将导致非常不同的值。如果您以字符串形式获取数字,请先将它们转换为 int

echo (int)$var1 ^ (int)$var2;

【讨论】:

  • 我已经这样做了,但是在更改为 int 之后,它为变量 1 提供了不同的值。例如“6463334891”在应用 int 后给出的变量 1 的值为 2147483647。
【解决方案2】:

那是因为你击中的是 MAXIMUM INTEGER LIMIT,即 2147483647

来自 PHP 文档...

最大值取决于系统。 32位系统最大 -2147483648 到 2147483647 的有符号整数范围。例如 这样的系统,intval('1000000000000') 将返回 2147483647。 64 位系统的最大有符号整数值为 9223372036854775807.

因此,要处理如此大的整数,您需要使用像 (GMP) GNU Multiple Precision 这样的扩展名

<?php
$v1="6463334891";
$v2="1000212390";
$a = gmp_init($v1);
$b = gmp_init($v2);
echo gmp_intval($a) ^ gmp_intval($b); //"prints" 7426059853

否则,切换到 64-bit system.

【讨论】:

    【解决方案3】:

    我维护大整数值的解决方案是将它们转换为二进制(使用 base_convert 导致 decbin 不起作用),然后对每一位进行异或,最后将字符串转换为十进制。

    function binxor($w1,$w2)
    {
        $x=base_convert($w1, 10, 2);
    
        $y=base_convert($w2, 10, 2);
    
        // adjust so both have same lenght
    
        if (strlen($y)<strlen($x)) $y=str_repeat(0,strlen($x)-strlen($y)).$y;
    
        if (strlen($x)<strlen($y)) $x=str_repeat(0,strlen($y)-strlen($x)).$x;
    
    
        $x=str_split($x);$y=str_split($y);
    
        $z="";
        for ($k=0;$k<sizeof($x);$k++)
        {
            // xor bit a bit
            $z.=(int)($x[$k])^(int)($y[$k]);
        }
    
        return base_convert($z,2,10);   
    }
    

    另外,将大数调整为 32 位

    bindec(decbin($number))
    

    因为 decbin 会自动将数字削减为 32。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2022-09-25
      • 2016-03-18
      • 2018-10-24
      相关资源
      最近更新 更多