XOR两个十六进制字符串

时间:2013-01-15 13:18:23

标签: php xor

我想在php中对两个字符串(十六进制编码)进行异或。 我试过使用operator ^,但我只得到0。 我怎样才能做到这一点?为什么这是错的?

4 个答案:

答案 0 :(得分:8)

<?php 
    $s1 = 'ABCDEF1234567890';
    $s2 = '0987654321ABCDEF';
    $x = bin2hex(pack('H*',$s1) ^ pack('H*',$s2));
?>

答案 1 :(得分:2)

$x = dechex(hexdec($s1) ^ hexdec($s2));

http://codepad.org/fgRfAPAI

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

答案 2 :(得分:1)

在应用hex2bin()之前,您需要使用XOR ^ operator解码它们。

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

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

答案 3 :(得分:0)

根据@ KingCrunch在这里的答案和评论我写了这个简单的循环来比较八位字节并建立答案。有趣的是,这与@ 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答案的人。