Код Java для вычисления CRC 16

Ниже моя шестнадцатеричная строка

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";

и это моя CRC: A228, которая добавляется к указанной выше строке. Я хочу выводить как A228

Используемый полином 0xA001

Может ли кто-нибудь предоставить мне код для расчета CRC16

Ниже мой код Java

String str="01312D0102D6010162000600000918000000000000000000000000007FFF00150010004B0100003A200207000004040055516200050E9E000200000000005852324531533156304330000001614B00541E0C07110507320000000000000000000000000500000000000000000406000030313030313033300000000000000000000046300A1D1655000186A0FFFF9EAA00000043000000000200000C000C000C000C000D000C000D000C000D000C000D000D000C000C000C000C000D000C000D000D000C000D000D000C000D000D000C000D000D000D000C000D000D000D000E000D000C000D000D000D000D000C000D000D000D000E000D000D000D000C000D000D029E029F02F102EA05300544085A07C1060F040A036404E0072F064804AA040404070510066B067205C304B302C6000D000D000D000E000D000D000E000D000E000D000D000E000D000D000E000D000E000D000E000D000E000D000D0065006300810081025102E001990082001F000E000D000E000D000E000E000D000E000D000E000E001500560062003300480068009000AF00AE00AE0214048404670560007E000E000E000E000E000E000F000E000E000E000E000E005501290168000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000D000E000D000E000E000E000D000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000E000D000E000E000D000E000E000D000E000E000E000D000E000D000E000D000E000D000E000D000E000E000D000E000D000D000D000D000D000C000D000D000E000D000D000D000D000D000D000D000E000D000D000E000D000D000E000D000D000D000D000D00E200DF00DF000F000E000D007300DF";//A228";

    byte arr[] = toByteArray(str);


        long polynomial = 0xA001;
        long CRC = 0xFFFF;

        for (byte b : arr)
        {
            CRC ^= b;
            for (int i = 8; i != 0; i--)
            {
                if ((CRC & 0x0001) != 0)
                {
                    CRC = (CRC >> 1) ^ polynomial;
                }
                else
                {
                    CRC >>= 1;
                }
            }
        }



        System.out.println(CRC);

}

Я получаю вывод как -56289


person Peter    schedule 12.09.2017    source источник
comment
StackOverflow работает не так. Что ты пробовал? Вы пробовали гуглить crc16 java?   -  person OptimusCrime    schedule 12.09.2017
comment
Ну конечно; естественно !   -  person Peter    schedule 12.09.2017
comment
Как насчет этого примера: stackoverflow.com/a/13209435/921563   -  person OptimusCrime    schedule 12.09.2017
comment
Прежде всего, ваша реализация toByteArray кажется неправильной, так как ваш код выводит -56855 при использовании правильного декодированного Hex str.   -  person Robert    schedule 12.09.2017
comment
Вы, конечно, не увидите A228, просто напечатав длинное число, так как оно будет содержать только цифры. Возможно, вы хотели распечатать его в шестнадцатеричном формате с помощью System.out.printf("%x%n", CRC);?   -  person VGR    schedule 12.09.2017
comment
Я получаю вывод как: ffffffffffff3637 @VGR   -  person Peter    schedule 13.09.2017


Ответы (1)


Ваш код в основном в порядке и будет выдавать 0xa228 для этого сообщения (с модификацией ниже), за исключением того, что вы должны передать ему правильные данные, а затем правильно отобразить полученный CRC.

Чтобы передать ему нужные данные, вам сначала нужно преобразовать эту строку шестнадцатеричных символов в половину этого числа двоичных байтов. Добавьте это в свою процедуру CRC.

Во-вторых, отображайте результат в шестнадцатеричном, а не десятичном виде.

В-третьих, byte подписан, поэтому сделайте CRC ^= b & 0xff;, чтобы избежать расширения знака.

person Mark Adler    schedule 12.09.2017
comment
Я конвертирую строку в байтовый массив. Также я печатаю его в шестнадцатеричном формате, и все же получаю вывод как: ffffffffffff3637 - person Peter; 13.09.2017
comment
Прочтите мой ответ внимательнее. Вам нужно преобразовать шестнадцатеричное в байты. Ваши 1460 символов станут 730 байтами, а не 1460 байтами. - person Mark Adler; 13.09.2017
comment
Также я заметил, что вам нужно исправить проблему подписанного байта в Java. - person Mark Adler; 13.09.2017
comment
Вам нужно предоставить свою toByteArray процедуру, чтобы знать, что здесь на самом деле происходит. - person Mark Adler; 13.09.2017