3

PHPで2つの文字列(16進エンコード)をXORしたいと思います。演算子^を使用してみましたが、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

あなたが最初に抱えていた問題は、16進文字列が実際には文字列であることです。文字列に二項演算子を使用すると、文字コードがバイト値として使用されます。

于 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 operatorを適用する前に、 hex2bin()でそれらをデコードする必要があります。^

更新:この関数には PHP/5.4 以降が必要であり、これが問題になる可能性があることをいつも忘れています。そのような場合、あまり直観的ではないpack()関数を使用する必要があります。

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