【问题标题】:Different behavior of the operator ^ in PHP and PerlPHP 和 Perl 中运算符 ^ 的不同行为
【发布时间】:2015-12-16 12:09:41
【问题描述】:

我将脚本从 Perl 移植到 PHP,但出现错误。以下代码为相同的输入数据返回不同的结果。相反,字符串返回到 Perl 的时间比 PHP 中的行长 2 倍,但此行的开头与 PHP 的行重合。 我希望它对输入行进行编码,但直到最后我才能弄清楚。

$test = $password ^ $newchal;

请帮我在 PHP 中获得与在 Perl 中相同的 $test 值?

【问题讨论】:

  • 两个变量都是字符串吗?
  • 是的!两个变量都是字符串。
  • var_dump($password);var_dump($newchal);exact 输出是什么?
  • string(8) "password" string(16) "Т®“LU)dЮ·ЃqцJ€"
  • 这条线比$password长度8短2倍是合乎逻辑的。我试图将它转换为UTF-16,但结果是另一个。

标签: php perl


【解决方案1】:

语言的定义行为似乎不同。

For Perl:

如果二进制按位运算的操作数是不同大小的字符串, |和 ^ ops 就像较短的操作数有额外的零位一样 在右边

PHP documentation 似乎没有定义在这种情况下会发生什么,但其中一个示例给出了它:

echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
                 // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

看来,在 PHP 中,较长字符串中的多余字符将被丢弃,而在 Perl 中它们将被包含在内。

更新:

要在 PHP 中获得所需的行为,有几个选项。您可以在字符串末尾添加空字符。

$password = '        ';
$newchal = "abcdefghijklmnop";

#prints ABCDEFGH
echo $password ^ $newchal;

$password .= "\0\0\0\0\0\0\0\0";

#prints ABCDEFGHijklmnop
echo $password ^ $newchal;

此示例假定字符串始终是固定的已知长度。如果您需要处理任意情况,您可以测量每个字符串的长度,然后根据需要添加空字符。当然,如果您不想更改原始变量,请在执行上述操作之前将其放入临时变量中。

【讨论】:

  • 哦,我怎样才能将零位添加到 PHP 中的最短值以实现相同的行为?
【解决方案2】:

正确答案(如果我们知道,密码不再是 $newchal)

$iterations = ceil(mb_strlen($newchal) / mb_strlen($password)) - 1;
  while($iterations > 0){
      $password .= ($password ^ $password);
     $iterations--;
  }
 $code = $password ^ $newchal;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2013-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多