3

16 ビット CRC を作成したいと思います。実際、私はそれで完全に準備ができているので、数時間前にテストしましたが、正しく動作しませんでした. しかし、私が発見したのは、インターネット上の例は、バイナリ除算については間違っている可能性があるということです。そのうちの 2 つだけをリンクします (たくさんあります!): http://www.ross.net/crc/download/crc_v3.txthttp://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 になります。コードが間違っている可能性がありますか? 私はそうは思いません.. 10 進数で数えましょう: 13744/19 = 723 で、残りは 7.. したがって、コードでは 111 が得られますが、これは実際には 10 進数では 7 ですが、例では 1110 が得られます。これは 14 です。これは間違っています。ですよね?

ウィキペディアの例を見ると、最初の計算と2番目の計算の両方で、再び間違っています。上のコードで数えると、10進数で良い結果が得られます。そして、私がチェックしたほとんどすべての例で、同じ結果が得られました。だから実際、私は何が欠けているのですか?

-------------------------------------------------- ------

更新: 作業コード

ちょっとキドス、私が約束したように、CRC演算を使用する完全に機能するバイナリ除算を提供します! 多項式演算を使いたいなら上のコードで全然OK!! メソッドを使用してgetRemainder()2 つの文字列を追加するだけで、残りがカウントされます。覚えておいてください: ビットが正しく到着した場合、残りは 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

最初のリンクの第 5 章を参照してください。「CRC 演算」を使用しています。「通常の」演算との主な違いは、キャリーを使用しないことです。第 5 章に示されている足し算の例は、割り算よりも理解しやすく、違いを示しています。

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

キャリーを使用する通常の算術では、これは次のようになります。

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

BigDecimal は「通常の」演算を使用するため、参照に示されているものとは異なる結果が得られます。

于 2012-11-08T21:02:11.560 に答える