3

I am analyzing a feed from a GPS which uses CRC-CCITT16 (Kermit) for the below message

Message From GPS Device:

(byte) 0x3,(byte) 0xfb,(byte) 0x0,(byte) 0x3,(byte) 0x13,(byte) 0x61,(byte) 0x2d,(byte) 0x5f,(byte) 0xc0,(byte) 0xa,(byte) 0x1,(byte) 0x1,(byte) 0x10,(byte) 0x55,(byte) 0xff,(byte) 0xb1,(byte) 0x59,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe4,(byte) 0x11,(byte) 0x7,(byte) 0xb8,(byte) 0x2,(byte) 0x2,(byte) 0x2,(byte) 0x77,(byte) 0x47,(byte) 0xc2,(byte) 0x6,(byte) 0x0,(byte) 0x0,(byte) 0x23,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x20,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x6,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x55,(byte) 0xff,(byte) 0xd2,(byte) 0xfb,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe5,(byte) 0xa1,(byte) 0x7,(byte) 0xb8,(byte) 0xa,(byte) 0x25,(byte) 0x2,(byte) 0x55,(byte) 0x0,(byte) 0x0,(byte) 0x5,(byte) 0x0,(byte) 0x0,(byte) 0x20,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x55,(byte) 0xff,(byte) 0xe1,(byte) 0x14,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe5,(byte) 0xa1,(byte) 0x7,(byte) 0xb8,(byte) 0xa,(byte) 0x25,(byte) 0x0,(byte) 0x56,(byte) 0x0,(byte) 0x0,(byte) 0x8,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x20,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x12,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x55,(byte) 0xff,(byte) 0xef,(byte) 0x2d,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe5,(byte) 0xa1,(byte) 0x7,(byte) 0xb8,(byte) 0xa,(byte) 0x25,(byte) 0x1,(byte) 0xe5,(byte) 0x0,(byte) 0x0,(byte) 0x6,(byte) 0x0,(byte) 0x0,(byte) 0xe,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x20,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x12,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x55,(byte) 0xff,(byte) 0xfd,(byte) 0x46,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe5,(byte) 0xa1,(byte) 0x7,(byte) 0xb8,(byte) 0xa,(byte) 0x25,(byte) 0x0,(byte) 0x27,(byte) 0x0,(byte) 0x0,(byte) 0x9,(byte) 0x0,(byte) 0x0,(byte) 0xa,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x20,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x38,(byte) 0x55,(byte) 0xc3,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xf7,(byte) 0x99,(byte) 0x7,(byte) 0xb8,(byte) 0xf,(byte) 0x9d,(byte) 0x0,(byte) 0x0,(byte) 0x48,(byte) 0x44,(byte) 0x4,(byte) 0x0,(byte) 0x3,(byte) 0x1b,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1c,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0xe,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x38,(byte) 0xa8,(byte) 0xd7,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe3,(byte) 0x17,(byte) 0x7,(byte) 0xb8,(byte) 0x14,(byte) 0x1b,(byte) 0x0,(byte) 0xc9,(byte) 0x45,(byte) 0xb0,(byte) 0x4,(byte) 0x0,(byte) 0x5,(byte) 0x14,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1d,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0xe,(byte) 0x17,(byte) 0x0,(byte) 0x0,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x38,(byte) 0xb6,(byte) 0xf0,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe3,(byte) 0x17,(byte) 0x7,(byte) 0xb8,(byte) 0x14,(byte) 0x1b,(byte) 0x0,(byte) 0x0,(byte) 0x45,(byte) 0xb0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1c,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0xf,(byte) 0x17,(byte) 0x0,(byte) 0x3,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x80,(byte) 0xf5,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xea,(byte) 0x62,(byte) 0x7,(byte) 0xb8,(byte) 0x14,(byte) 0xb1,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x4,(byte) 0x0,(byte) 0x0,(byte) 0x1f,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x0,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x9,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe6,(byte) 0xde,(byte) 0x7,(byte) 0xb8,(byte) 0x13,(byte) 0x10,(byte) 0x0,(byte) 0x24,(byte) 0x0,(byte) 0x0,(byte) 0x4,(byte) 0x0,(byte) 0x0,(byte) 0x1f,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x10,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x13,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe8,(byte) 0xc1,(byte) 0x7,(byte) 0xb8,(byte) 0x11,(byte) 0xe4,(byte) 0x0,(byte) 0x0,(byte) 0x30,(byte) 0x2a,(byte) 0x4,(byte) 0x0,(byte) 0x1,(byte) 0x1f,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0xe,(byte) 0x17,(byte) 0x0,(byte) 0x5,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xeb,(byte) 0x7d,(byte) 0x7,(byte) 0xb8,(byte) 0x10,(byte) 0xc9,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0x58,(byte) 0x4,(byte) 0x0,(byte) 0x2,(byte) 0x1f,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x2,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x27,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xec,(byte) 0x56,(byte) 0x7,(byte) 0xb8,(byte) 0x11,(byte) 0x3e,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0x58,(byte) 0x4,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x31,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe9,(byte) 0xed,(byte) 0x7,(byte) 0xb8,(byte) 0x10,(byte) 0xfb,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0x58,(byte) 0x4,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x0,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x3b,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xea,(byte) 0xc6,(byte) 0x7,(byte) 0xb8,(byte) 0xf,(byte) 0x18,(byte) 0x0,(byte) 0x7,(byte) 0x31,(byte) 0xec,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x0,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x56,(byte) 0x54,(byte) 0x81,(byte) 0x45,(byte) 0x0,(byte) 0x0,(byte) 0x2f,(byte) 0xd3,(byte) 0xe8,(byte) 0xf3,(byte) 0x7,(byte) 0xb8,(byte) 0xe,(byte) 0xe6,(byte) 0x0,(byte) 0x32,(byte) 0x31,(byte) 0xec,(byte) 0x4,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x7,(byte) 0x7,(byte) 0x5,(byte) 0x0,(byte) 0x1b,(byte) 0xff,(byte) 0x2,(byte) 0x0,(byte) 0x3,(byte) 0x0,(byte) 0x1c,(byte) 0x1,(byte) 0x20,(byte) 0x1f,(byte) 0xad,(byte) 0x0,(byte) 0x4,(byte) 0x1d,(byte) 0x0,(byte) 0x0,(byte) 0x1e,(byte) 0x0,(byte) 0x0,(byte) 0x16,(byte) 0x0,(byte) 0x11,(byte) 0x17,(byte) 0x0,(byte) 0x1,(byte) 0x2,(byte) 0x41,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x96,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0xad,(byte) 0xa4

where last 2 bytes is CRC. Java Code used to calculate the CRC is:

private static int crc16(byte[] buffer, int length) {
            int CRC = 0x0;
            int carry = 0;
            int poly = 0x8408;
            for(int index = 0; index < length; index++) {
                CRC ^= (buffer[index] & 0xFF);
                for(int i = 0; i < 8; i++) {
                    carry = CRC & 1;
                    CRC >>= 1;
                    if(carry != 0) {
                        CRC ^= poly;
                    }
                }

            }
            return CRC;
        }

On using the above code CRC calculate is 58001. But the CRC in the message is 44452. Can anyone help me out.I even tried other implementations for CRC calculation that too didn't work.

Dineshkumar
  • 294
  • 1
  • 6
  • 19
  • Your CRC code and the 58001 result are both correct for the stated CRC and provided message. How do you know that that is the CRC (Kermit) to be used? Are you certain that the message is copied here correctly and in its entirety? Are you sure that you know the location of the CRC in the message? Can you provide a few more examples of messages with CRCs? – Mark Adler Dec 20 '15 at 16:02
  • @Mark Adler, As you said, the code work. Problem is with the message where the first two byte holds the information about the packet length, on avoiding it in computation of the CRC it works perfectly.Can some body help me out in closing this question. – Dineshkumar Jan 11 '16 at 05:13
  • Then you've answered your own question! – Mark Adler Jan 11 '16 at 05:32

1 Answers1

2

The first two bytes are the length in big-endian order, 0x03fb = 1019. Dropping those and the last two bytes, which are the 16-bit CRC, you apply the code in the question to the remaining 1019 bytes. That gives you the CRC 0xada4, which is in fact what is stored at the end of the message, again in big-endian order, 0xad 0xa4.

Mark Adler
  • 101,978
  • 13
  • 118
  • 158