Функция JAVA CRC16 возвращает ответ из 3 символов вместо 4

У меня есть функция Java CRC16, как показано ниже, и мне нужно, чтобы она возвращала буквенно-цифровой результат длиной 4. Но иногда он возвращает только буквенно-цифровое число длиной 3. Почему? Я сравниваю этот CRC с приложением C, которое вычисляет CRC, и обычно это один и тот же CRC, но время от времени JAVA возвращает 3-символьный результат, который вызывает исключение. Почему?

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

    String str = "0009";

    byte []by = x; // x is the byte array from args
    for (byte b : by) {
        for (int i = 0; i < 8; i++) {
            boolean bit = ((b   >> (7-i) & 1) == 1);
            boolean c15 = ((crrc >> 15    & 1) == 1);
            crrc <<= 1;
            if (c15 ^ bit) crrc ^= polynomial;
         }
    }

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

person meska    schedule 25.04.2014    source источник
comment
Пожалуйста, опубликуйте также сообщение об ошибке/исключении.   -  person Sufian Latif    schedule 25.04.2014
comment
Мое первое предположение будет заключаться в том, что начальные нули не сохраняются в вашем выводе. Было бы проще, если бы вы показали нам свой реальный метод, который возвращает значение.   -  person Duncan Jones    schedule 25.04.2014
comment
Исключение возникает, когда я переставляю символы, а Integer.toHexString(crrc)[3] не существует (поскольку длина равна 3, а не 4.   -  person meska    schedule 25.04.2014
comment
Вместо toHexString используйте String.format(%04x, crrc)   -  person McDowell    schedule 25.04.2014


Ответы (1)


Вероятно, вы получаете ArrayIndexOutOfBoundException, поэтому я думаю, что шестнадцатеричное значение может иметь ноль в самом значимом полубайте. Попробуйте найти эти значения (x) и проверьте, (x >>> 12) == 0 или (x & 0xf000) == 0. Если это возвращает true, вы можете дополнить свою строку необходимым количеством 0s слева.

Один из возможных способов: String.format("%04d", crrc)

person Sufian Latif    schedule 25.04.2014