CRC16算法的Java实现

1 篇文章 0 订阅

1、算法

CRC 是先调入一值是全“1”的 16 位寄存器,然后调用一过程将消息中连续的 8 位字节各当前寄存器中的值进行处理。仅每个字符中的 8Bit 数据对 CRC 有效,起始位和停止位以及奇偶校验位均无效。

CRC 校验字节的生成步骤如下:

  1. 装一个 16 位寄存器,所有数位均为 1。
  2. 取被校验串的一个字节与 16 位寄存器的高位字节进行“异或”运算。运算结果放入这个 16 位寄存器。
  3. 把这个 16 寄存器向右移一位。
  4. 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算;若向右移出的数位是 0,则返回步骤(3)。
  5. 重复步骤(3)和步骤(4),直至移出 8 位。
  6. 取被校验串的下一个字节
  7. 重复步骤(3) ~ 步骤(6),直至被校验串的所有字节均与 16 位寄存器进行“异或”运算,并移位8 次。
  8. 这个 16 位寄存器的内容即 2 字节 CRC 错误校验码

2、代码

private static String getCrc(byte[] data) {  
        int high;  
        int flag;  
  
        // 16位寄存器,所有数位均为1  
        int wcrc = 0xffff;  
        for (int i = 0; i < data.length; i++) {  
            // 16 位寄存器的高位字节  
            high = wcrc >> 8;  
            // 取被校验串的一个字节与 16 位寄存器的高位字节进行“异或”运算  
            wcrc = high ^ data[i];  
  
            for (int j = 0; j < 8; j++) {  
                flag = wcrc & 0x0001;  
                // 把这个 16 寄存器向右移一位  
                wcrc = wcrc >> 1;  
                // 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算  
                if (flag == 1)  
                    wcrc ^= 0xa001;  
            }  
        }  
  
        return Integer.toHexString(wcrc);  
}  

3、测试

 public static void main(String[] args) {  
    	System.out.println(CRCA001.getCrc(new byte[]{(byte) 0xb4}));
    } 

结果:ffffc8bf正确

转载自 java实现的CRC16算法


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值