Проверка CRC-CCITT в java (android)

Привет, у меня есть некоторые данные, полученные через соединение Bluetooth. Данные имеют 16-битный блок CRC 16-CCITT, который я хочу использовать, чтобы убедиться, что данные были переданы успешно и без ошибок. Есть ли какой-либо встроенный метод в java или android, который может мне помочь, или мне нужно реализовать его самостоятельно? Нужно ли будет кодировать данные и сравнивать? У меня есть фрагмент кода для того, что я нашел в Интернете, но я не уверен, что он правильный или эффективный. Его можно найти по адресу: http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html и код:

    int crc = 0xFFFF;          // initial value
    int polynomial = 0x1021;   // 0001 0000 0010 0001  (0, 5, 12) 

    // byte[] testBytes = "123456789".getBytes("ASCII");

    byte[] bytes = args[0].getBytes();

    for (byte b : bytes) {
        for (int i = 0; i < 8; i++) {
            boolean bit = ((b   >> (7-i) & 1) == 1);
            boolean c15 = ((crc >> 15    & 1) == 1);
            crc <<= 1;
            if (c15 ^ bit) crc ^= polynomial;
         }
    }

    crc &= 0xffff;
    System.out.println("CRC16-CCITT = " + Integer.toHexString(crc));

Я также видел, что в Java есть реализация crc32 по адресу http://download.oracle.com/javase/1.4.2/docs/api/java/util/zip/CRC32.html. Это что-то, что я могу использовать здесь?

Спасибо.


person ekatz    schedule 31.05.2011    source источник


Ответы (1)


Это очень неэффективно. В Интернете существует табличная версия, изначально написанная на C в 1980-х годах, которая работает как минимум в 8 раз быстрее. В статье Википедии есть несколько ссылок.

person user207421    schedule 31.05.2011
comment
Спасибо за ваш ответ. Я согласен с тем, что это неэффективно, и я рассмотрю возможность его изменения на более эффективное решение с использованием JNI, но пока мне все еще нужно знать, что такое решение JAVA... - person ekatz; 01.06.2011
comment
@ekatz Я ничего не говорил об использовании JNI. Просто транслитерируйте одну из существующих реализаций C или найдите реализацию Java. Это всего около 20 строк кода. - person user207421; 02.06.2011
comment
в этом и был смысл вопроса - после поиска реализации Java я пришел к этой реализации, которая, как вы говорите, неэффективна, я пытаюсь выяснить, есть ли у кого-нибудь лучшая реализация Java. - person ekatz; 02.06.2011
comment
@ekatz, в этом и был смысл моего ответа и комментариев. Это не сложно, я делал это много раз на протяжении многих лет. - person user207421; 04.06.2011