我想创建一个 16 位 CRC。实际上我已经完全准备好了,所以几个小时前我测试了它,但没有正常工作。但是我发现互联网上的例子可能是关于二进制除法的错误。我只链接了其中的两个(很多!):http : //www.ross.net/crc/download/crc_v3.txt,http: //en.wikipedia.org/wiki/Cyclic_redundancy_check
所以我对二进制除法所做的是我使用 BigIntegers。像这样:
BigInteger divisor = new BigInteger("10011", 2);
BigInteger dividend = new BigInteger("11010110110000", 2);
BigInteger[] result = dividend.divideAndRemainder(divisor);
这些值可以在第一个链接中看到(6. 完整的示例)。让我们看看结果,参考给我的余数是 1110,我上面的代码给我 111。可能是代码错误?我不这么认为.. 让我们以十进制数计算:13744/19 = 723,余数为 7.. 所以代码给我 111,实际上是十进制的 7,但示例给我 1110,即 14。这是错误的不是吗?
如果您看到 wikipedia 示例,它再次给出错误,无论是第一次计算还是第二次计算。当我用上面的代码计算它们时,它给了我一个很好的十进制结果。几乎所有我检查的例子,我都得到了相同的结果。所以实际上,我到底错过了什么?
-------------------------------------------------- ------
更新:工作代码
嘿孩子们,正如我承诺的那样,我提供了一个使用 CRC 算术的完整的二进制除法!如果你想使用多项式算术,上面的代码是完全可以的!只需使用该getRemainder()
方法并添加两个字符串,它就会计算余数。请记住:如果您的位正确到达,则余数将为 0!在这个例子中,它给你一个长度为 0 的字符串!玩得开心!
public class BinaryDivision {
String substracted;
public BinaryDivision(){
}
public String getRemainder(String dividend, String divisor){
int dividendLength = dividend.length();
int divisorLength = divisor.length();
String quotient="";
String examinedP="";
String divisorP="";
substracted="";
int indexNumber;
int substractZeros=0;
for (int i=0;i<divisorLength;i++){
examinedP = examinedP + dividend.charAt(i);
}
indexNumber = divisorLength;
for (int j=0;j<(dividendLength-divisorLength);j++){
//START
if ( Integer.parseInt(String.valueOf(examinedP.charAt(0)))==1){
quotient=quotient + "1";
int a = divisor.length();
//substracting
for (int i = 0;i<a;i++){
// System.out.println(examinedP.charAt(i) + " " + divisor.charAt(i));
substracted = substracted +
CRC_substract(Integer.parseInt(String.valueOf(examinedP.charAt(i))),
Integer.parseInt(String.valueOf(divisor.charAt(i))));
}
substracted = substracted.substring(1);
//----------------------------------------------
substracted = substracted + dividend.charAt(indexNumber);
}
else {
quotient=quotient + "0";
int a = divisor.length();
//substracting
for (int i = 0;i<a;i++){
//System.out.println(examinedP.charAt(i) + " " + 0);
substracted = substracted +
CRC_substract(Integer.parseInt(String.valueOf(examinedP.charAt(i))),
0);
}
substracted = substracted.substring(1);
substracted = substracted + dividend.charAt(indexNumber);
}
examinedP = substracted;
//System.out.print(examinedP);
substracted="";
//System.out.println(" "); System.out.println(" ");
indexNumber++;
}
//counting remainder - if it starts with 0 - bye bye 0s..
for (int i = 0;i<examinedP.length();i++){
if (Integer.parseInt(String.valueOf(examinedP.charAt(i)))==0){
substractZeros++;
}
else {
break;
}
}
examinedP = examinedP.substring(substractZeros);
// System.out.println(" "); System.out.println(" ");
// System.out.print(examinedP);
return examinedP;
}
//XOR - Exclusive OR
public int CRC_substract(int a, int b){
if (a==0 && b==0){
return 0;
}
else if (a==0 && b==1){
return 1;
}
else if (a==1 && b==0){
return 1;
}
else if (a==1 && b==1){
return 0;
}
return -1;
}
}