java - CRC-CCITT(克米特)

标签 java gps crc crc16

我正在分析来自使用 CRC-CCITT16 (Kermit) 的 GPS 的提要 对于下面的消息

来自 GPS 设备的消息:

(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

最后 2 个字节是 CRC。 用于计算CRC的Java代码是:

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;
        }

使用上面的代码计算得到的CRC是58001,但是报文中的CRC是44452。 任何人都可以帮助我。我什至尝试了其他 CRC 计算实现,但也没有用。

最佳答案

前两个字节是大端顺序的长度,0x03fb = 1019。删除那些和最后两个字节,即 16 位 CRC,您应用问题中的代码到剩余的 1019 个字节。这为您提供了 CRC 0xada4,它实际上是存储在消息末尾的内容,同样以大端顺序 0xad 0xa4

关于java - CRC-CCITT(克米特),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378322/

相关文章:

protocol-buffers - Protobuf 校验和 (crc)

python - 使用 Python 将数据字节 append 到二进制文件

java - 在 java 中为 ImageView 设置图像的代码?

java - WorldWind Java Google Earth Like Zoom

java - Hibernate 处理日期和时间 - PostgreSql

java - 如何修复GPS服务程序中的空指针异常?

android - 如何使用 Target API 23 及更高版本通过 GPS 获取用户位置

iOS 检测模拟位置

networking - 如果数据使用校验和的 TCP,ftp 协议(protocol)为什么有时会产生传输错误?

java - 即使主签名正确,也会出现 "class does not have a static void main method accepting String[]"错误