【问题标题】:XOR two hex strings异或两个十六进制字符串
【发布时间】:2013-03-20 02:34:41
【问题描述】:

我想在 php.ini 中对两个字符串(十六进制编码)进行异或运算。 我曾尝试使用运算符 ^,但我只得到 0。 我怎样才能做到这一点?为什么会出错?

【问题讨论】:

  • 如果字符串不是有效的十六进制字符串怎么办?如果它们的长度不同怎么办?
  • 如果它只有 32 位,您可能可以将其扫描为整数并进行异或。如果更多,您可能需要编写自己的函数。
  • 要注意的关键是 ^ 会将其操作数转换为数字,它不会对任意长度的字符串进行操作。因此,您需要遍历字符串,一次转换一个八位字节。

标签: php xor


【解决方案1】:
<?php 
    $s1 = 'ABCDEF1234567890';
    $s2 = '0987654321ABCDEF';
    $x = bin2hex(pack('H*',$s1) ^ pack('H*',$s2));
?>

【讨论】:

  • 谢谢lawl0r - 我应该回来评论自己,因为我发现情况确实如此。点赞!
【解决方案2】:
$x = dechex(hexdec($s1) ^ hexdec($s2));

http://codepad.org/fgRfAPAI

您最初遇到的问题是,十六进制字符串实际上是一个字符串。当您对字符串使用二进制运算符时,它使用字符代码作为字节值。

【讨论】:

  • 这不适用于任意长度的字符串 - 但他可以调整您的技术以逐个八位字节地进行操作
  • 是的,如果超过 32 位整数范围,则史诗失败。
  • @KingCrunch 这是一种增强你的答案的方法。
【解决方案3】:

在应用XOR ^ operator 之前,您需要使用hex2bin() 对其进行解码。

更新:我总是忘记这个函数需要 PHP/5.4 或更高版本,这可能是个问题。在这种情况下,您需要使用不太直观的pack() 函数:

$binary = pack('H*', $hexadecimal);

【讨论】:

    【解决方案4】:

    基于@KingCrunch 在此处的回答和 cmets,我编写了这个简单的循环来比较八位位组并构建答案。有趣的是,这与@lawlor 的回答结果相同。

    $key1 = 'ABCDEF1234567890ABCDEF1234567890';
    $key2 = '0987654321ABCDEF0987654321ABCDEF';
    
    $key1_octets = str_split($key1, 2);
    $key2_octets = str_split($key2, 2);
    $xor = '';
    foreach ($key1_octets as $id => $key1_octet) {
      $xor .= dechex(hexdec($key1_octets[$id]) ^ hexdec($key2_octets[$id]));
    }
    print $xor;
    
    print bin2hex(pack('H*',$key1) ^ pack('H*',$key2));
    

    我实际上不确定其中任何一个是否是有效的结果,但我提出这个是为了反馈,以防它帮助其他正在查看@KingCrunch 答案但不知道如何处理八位字节的人。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 1970-01-01
      • 2016-01-23
      • 2013-06-28
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多