CRC原理和程序实现方法1_哔哩哔哩_bilibili
其实原理很简单 但是我想了两个小时。。
收获的是原来一些复杂的运算都可以通过位运算来实现。
实现思路
public class CRC16Calculator {public static String CRC16(byte[] bytes) {int CRC = 0x0000ffff;int POLYNOMIAL = 0x0000a001;int i, j;for (i = 0; i < bytes.length; i++) {CRC ^= ((int) bytes[i] & 0x000000ff);for (j = 0; j < 8; j++) {if ((CRC & 0x00000001) != 0) {CRC >>= 1;CRC ^= POLYNOMIAL;} else {CRC >>= 1;}}}return Integer.toHexString(CRC);}public static void main(String[] args) {byte[] s = {1, 3, 4, 1, (byte) 205, 1, 18, (byte) 235, (byte) 173};System.out.printf("1111%s\r\n", CRC16(s));System.out.printf("%d\n", s.length);if (!CRC16(s).equals("00")) {System.out.printf("2222%s\n", CRC16(s));}}
}
测试结果
Java 在线工具 | 菜鸟工具 (runoob.com)
C语言
#include<stdio.h>
#include<stdint.h>int main(){uint8_t crc = 0; //初始化校验码uint8_t data = 0xb3;uint8_t poly = 0x09;crc = data;for(int i = 0; i < 8; i++){if(crc & 0x80) //判断最高位是不是1crc = (crc << 1)^poly;elsecrc = crc << 1; } printf("crc = 0x%x\n",crc>>4);
}
多字节