我有两个表示十六进制数字的字符串,我需要进行逐位比较。每个十六进制数等于256位。我需要确定有多少位不同。我怎样才能在perl
?
$hash1 = "7ff005f88270898ec31359b9ca80213165a318f149267e4c2f292a00e216e4ef";
$hash2 = "3fb40df88a78890e815251b1fb8021356da330f149266f453f292a11e216e4ee";
我的问题与此question类似,但我需要在perl
中进行。
答案 0 :(得分:3)
my $bytes1 = pack('H*', $hash1);
my $bytes2 = pack('H*', $hash2);
my $xor = unpack('B*', $bytes1 ^ $bytes2);
my $count = $xor =~ tr/1//;
pack('H*', ...)
将十六进制字符串转换为字节字符串。然后对字节字符串进行异或,并将其转换为带有unpack('B*', ...)
的位字符串。 tr
运算符用于计算位串中的1(不同位)数。
或者,使用checksum trick described here:
my $bytes1 = pack('H*', $hash1);
my $bytes2 = pack('H*', $hash2);
my $count = unpack('%32B*', $bytes1 ^ $bytes2);
答案 1 :(得分: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;