3

我想创建一个 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;
    }



}
4

1 回答 1

4

请参阅第一个链接中的第五章:他们正在使用“CRC 算术”。与“正常”算术的主要区别在于它们不使用进位。第五章中的加法示例比除法更容易理解,并显示了差异:

 10011011
+11001010
 --------
 01010001

在使用进位的正常算术中,这将是

 10011011
+11001010
 --------
101100101

由于 BigDecimal 使用“正常”算术,因此您得到的结果与参考文献中显示的结果不同。

于 2012-11-08T21:02:11.560 回答