如何对两个十六进制字符串进行逐位比较?

时间:2016-10-13 00:39:07

标签: perl hex bitwise-operators

我有两个表示十六进制数字的字符串,我需要进行逐位比较。每个十六进制数等于256位。我需要确定有多少位不同。我怎样才能在perl

中执行此操作
$hash1 = "7ff005f88270898ec31359b9ca80213165a318f149267e4c2f292a00e216e4ef";
$hash2 = "3fb40df88a78890e815251b1fb8021356da330f149266f453f292a11e216e4ee";

我的问题与此question类似,但我需要在perl中进行。

2 个答案:

答案 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;