我想在 php 中对两个字符串(十六进制编码)进行异或。我曾尝试使用运算符 ^,但我只得到 0。我该怎么做?为什么是错的?
问问题
8276 次
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));
您最初遇到的问题是,十六进制字符串实际上是一个字符串。当您对字符串使用二进制运算符时,它使用字符代码作为字节值。
于 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 回答