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) //判断最高位是不是1
crc = (crc << 1)^poly;
else
crc = crc << 1;
}
printf("crc = 0x%x\n",crc>>4);
}
多字节