Question

I have a Java CRC16 function like below and I need it to return a 4 length alphanumeric result. But sometimes it returns only a 3 length alphanumeric. Why? I am cross comparing this CRC with a C application that calculates the CRC and usually it is the same CRC but from time to time the JAVA returns a 3 character result which raises an exception. Why?

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());
Was it helpful?

Solution

You're receiving ArrayIndexOutOfBoundException probably, so I think the hex value might have zero in its most significant nibble. Try to find out those values(x) and check whether (x >>> 12) == 0 or (x & 0xf000) == 0. If this returns true, you can pad your string with necessary number of 0s from the left.

One possible way: String.format("%04d", crrc)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top