3

我想在 php 中对两个字符串(十六进制编码)进行异或。我曾尝试使用运算符 ^,但我只得到 0。我该怎么做?为什么是错的?

4

4 回答 4

10
<?php 
    $s1 = 'ABCDEF1234567890';
    $s2 = '0987654321ABCDEF';
    $x = bin2hex(pack('H*',$s1) ^ pack('H*',$s2));
?>
于 2013-01-15T13:30:47.080 回答
2
$x = dechex(hexdec($s1) ^ hexdec($s2));

http://codepad.org/fgRfAPAI

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

于 2013-01-15T13:22:08.937 回答
1

基于@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 的答案。

于 2013-03-19T18:34:41.133 回答
1

在应用XOR运算符之前,您需要使用hex2bin()对它们进行解码。^

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

$binary = pack('H*', $hexadecimal);
于 2013-01-15T13:21:25.963 回答