2016-10-13 4 views
1

私は、ビット単位の比較を行うために必要な16進数を表す2つの文字列を持っています。各16進数は256ビットに相当します。どのくらいのビットが異なるかを判断する必要があります。 perlでどうすればいいですか?2つの16進文字列のビット単位の比較方法は?

$hash1 = "7ff005f88270898ec31359b9ca80213165a318f149267e4c2f292a00e216e4ef"; 
$hash2 = "3fb40df88a78890e815251b1fb8021356da330f149266f453f292a11e216e4ee"; 

私の質問は、このquestionに似ていますが、私はperlでそれを行う必要があります。

答えて

1
$hash1 =~ s/([a-f0-9][a-f0-9])/unpack('B*',pack('H*',$1))/egi; 
$hash2 =~ s/([a-f0-9][a-f0-9])/unpack('B*',pack('H*',$1))/egi; 

$count = ($hash1^$hash2) =~ tr/\0//c; 
+0

あなたは、コードを少し説明できますか? '' /// ''の置換えは不要です。また、同じビット数を返します。 – nwellnhof

+0

@nwellnhof最初の2行は16進数を2進数に変換します。代替物がないとどうして起こりますか?違いを返すために '/ c'を追加しました。 – CJ7

3
my $bytes1 = pack('H*', $hash1); 
my $bytes2 = pack('H*', $hash2); 
my $xor = unpack('B*', $bytes1^$bytes2); 
my $count = $xor =~ tr/1//; 

pack('H*', ...)バイト文字列に進文字列に変換します。その後、バイト列はXORされ、unpack('B*', ...)でビット列に変換されます。 tr演算子は、ビット列の1(異なるビット)の数をカウントするために使用されます。

または、checksum trick described hereを使用して:

my $bytes1 = pack('H*', $hash1); 
my $bytes2 = pack('H*', $hash2); 
my $count = unpack('%32B*', $bytes1^$bytes2); 
関連する問題