【问题标题】:PHP XOR stringsPHP XOR 字符串
【发布时间】:2016-03-18 20:24:56
【问题描述】:

我从an answer on PPCG看到了这段代码:

echo BeeABBeeoBodBaBdOdPQBBgDQgDdp^"\n\n\t8b\n\n\t\nb&\nb b  \n%%nb%%%\n%\nQ";

我知道 PHP 将未定义的常量转换为字符串,所以等效代码是:

echo 'BeeABBeeoBodBaBdOdPQBBgDQgDdp' ^ "\n\n\t8b\n\n\t\nb&\nb b  \n%%nb%%%\n%\nQ";

这些输出是:

Holy Hole In A Donut, Batman!

有人可以向我解释这两个字符串的异或是如何产生那行输出的吗?

【问题讨论】:

    标签: php xor


    【解决方案1】:

    根据this official example,在字符串上使用XOR 将对每个相应字符的ASCII 值进行操作,因此在您的示例中:

    • B ^ \n = 66 ^ 10 = 72 = H;
    • e ^ \n = 101 ^ 10 = 111 = o;
    • e ^ \t = 101 ^ 9 = 108 = l;
    • ...

    3v4l result

    【讨论】:

    • 这出乎意料。我有完全相同的答案,虽然在我注意到有人回答了这个问题之前,我忙着查找为什么 60 ^ 10 = 72
    • @SpencerWieczorek 这在 SO 中很正常 :) 总是有人比你快几秒钟。出于这个原因,我放弃了很多答案。
    【解决方案2】:

    这只是在整个字符串中一次对两个字符应用xor。这是通过转换为 ASCII 来完成的,然后结果是 ascii 值,这是两个转换项之间的值之差。请参阅 PHP 文档中的 example 2。所以结果:

    "B" ^ "\n" => 66 ^ 10 => 72 => "H"
    

    整个字符串以此类推。

    【讨论】:

      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多