比较两个字符串十六进制找到匹配的比特数(Compare two hex strings to fin

2019-10-21 03:20发布

我有两个十六进制字符串:

string x = "928fe46f228555621c7f42f3664530f9";
string y = "56cd8c4852cf24b1182300df2448743a";

我想将它们转换为二进制找到多少位的两位十六进制字符串之间匹配。

我用这个功能来HEX转换为二进制:

 string GetBinaryStringFromHexString (string sHex)
 {
     string sReturn = "";
     for (int i = 0; i < sHex.length (); ++i)
     {
         switch (sHex [i])
         {
             case '0': sReturn.append ("0000"); break;
             case '1': sReturn.append ("0001"); break;
             case '2': sReturn.append ("0010"); break;
             case '3': sReturn.append ("0011"); break;
             case '4': sReturn.append ("0100"); break;
             case '5': sReturn.append ("0101"); break;
             case '6': sReturn.append ("0110"); break;
             case '7': sReturn.append ("0111"); break;
             case '8': sReturn.append ("1000"); break;
             case '9': sReturn.append ("1001"); break;
             case 'a': sReturn.append ("1010"); break;
             case 'b': sReturn.append ("1011"); break;
             case 'c': sReturn.append ("1100"); break;
             case 'd': sReturn.append ("1101"); break;
             case 'e': sReturn.append ("1110"); break;
             case 'f': sReturn.append ("1111"); break;
         }
     }
     return sReturn;
 }

因此,在二进制序列X - > 10010010100011111110010001101111001000101000010101010101011000100001110001111111010000101111001101100110010001010011000011111001

和字符串二进制y为 - > 01010110110011011000110001001000010100101100111100100100101100010001100000100011000000001101111100100100010010000111010000111010

但现在我卡住了,我怎么能异或两个字符串来查找匹配的位数? 我怎么能算呢?

不要紧,我是否使用Java或C ++,谁能帮助请

谢谢,

Answer 1:

在Java中这是很容易的。

public static int numberOfMatchingOnes(String a, String b) {
    BigInteger aNumber = new BigInteger(a, 16);
    BigInteger bNumber = new BigInteger(b, 16);

    return aNumber.xor(bNumber).bitCount();
}

在C ++中,你可以使用一个bitset。 你正在寻找被称为汉明权重 。

如果你真的想这样做,不BigInteger的 :取4个字符两个字符串的,将它们转换成一个int,XOR他们算一个位。 重复,直到字符串结束。

public static int numberOfMatchingOnes(String a, String b) {
    if (a.length() != b.length() || a.length() % 4 != 0) {
        throw new IllegalArgumentException("invalid strings");
    }

    int totalCount = 0;
    for (int i = (a.length()-1)/4; i >= 0; i--) {
        int aValue = Integer.valueOf(a.substring(i * 4, i * 4 + 4), 16);
        int bValue = Integer.valueOf(b.substring(i * 4, i * 4 + 4), 16);
        totalCount += Integer.bitCount(aValue ^ bValue);
    }
    return  totalCount;
}

你可以看一下Java的源代码 ,看看如何bitCount()的作品。



Answer 2:

你有两个字符串。 为什么不通过他们的性格运行性格,看看他们是否匹配与否? 初始化一计数器为零,并开始递增它们用于在循环结束时每个匹配和显示。 要简单得多。

这里是一个班轮解决方案,但(与世界上所有图书馆的功率):

System.out.println(StringUtils.countMatches(new BigInteger("928fe46f228555621c7f42f3664530f9",16).xor(new BigInteger("56cd8c4852cf24b1182300df2448743a",16)).toString(2),"1"));


Answer 3:

如果你想找到他们匹配在一起,你可以使用 C中,它取决于你的目的:

#include <stdio.h>
int toBinary(unsigned int b1,unsigned int b2){
unsigned int b = b1 & b2;
printf("%x & %x = %x\n",b1,b2,b);
}
int main(){
int i,a,b;
unsigned int b1 = 0x100100;
unsigned int b2 = 0x010101;
toBinary(b1,b2);
return 0;
} 

从右到左上面的代码中的二进制比较数字和地方两个位分别为1,则返回1,否则返回0

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~

如果你想寻找到相同或用C不使用XOR:

#include <stdio.h>
int toBinary(unsigned int b1,unsigned int b2){
unsigned int b = b1 ^ b2;
printf("%x & %x = %x\n",b1,b2,b);
}
int main(){
int i,a,b;
unsigned int b1 = 0x100100;
unsigned int b2 = 0x010101;
toBinary(b1,b2);
return 0;
} 


文章来源: Compare two hex strings to find number of matching bits