16 位CRC 校验C代码编写 。 计算步骤为: a) 预置16 位寄存器为十六进制FFFF(即全为1),称此寄存器为CRC 寄存器; b) 把第一个8 位数据与16 位CRC 寄存器的低位相异或,把结果放于CRC 寄存器; c) 把寄存器的内容右移一位(朝低位),用0 填补最高位,检查最低位(注意:这时的最低位指移位前的最低位,不是移位后的最低位); d) 如果最低位为0:重复第3 步(再次移位),如果最低位为1:CRC 寄存器与多项式A001H(1010000000000001B)进行异或; e)
时间: 2024-02-26 15:57:49 浏览: 15
好的,以下是计算16位CRC校验的C代码:
```c
#include <stdint.h>
uint16_t crc16(uint8_t *data, uint32_t len) {
uint16_t crc = 0xFFFF;
uint16_t poly = 0xA001; // 多项式A001H
for (uint32_t i = 0; i < len; i++) {
crc ^= data[i];
for (int j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ poly;
} else {
crc >>= 1;
}
}
}
return crc;
}
```
该函数接收一个指向要计算CRC校验的数据的指针和数据长度,并返回计算出的16位CRC校验值。在函数内部,我们首先将CRC寄存器预置为0xFFFF,然后按照题目所述的步骤对数据进行处理,最后返回CRC寄存器中的值作为结果。
希望这个代码对你有所帮助!
相关问题
用C语言编写16位CRC校验程序代码
以下是一个用C语言编写的16位CRC校验程序代码:
```c
#include <stdio.h>
#include <stdint.h>
#define POLY 0x1021 // CRC-16-CCITT多项式
uint16_t crc16_ccitt(uint8_t *data, uint16_t len)
{
uint16_t crc = 0xFFFF; // 初始值为0xFFFF
uint16_t i, j;
for (i = 0; i < len; i++) {
crc ^= (uint16_t)(data[i] << 8);
for (j = 0; j < 8; j++) {
if (crc & 0x8000) {
crc = (crc << 1) ^ POLY;
} else {
crc <<= 1;
}
}
}
return crc;
}
int main()
{
uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; // 测试数据
uint16_t len = sizeof(data) / sizeof(data[0]); // 数据长度
uint16_t crc = crc16_ccitt(data, len); // 计算CRC校验值
printf("CRC-16-CCITT = 0x%04X\n", crc);
return 0;
}
```
在这个程序中,我们使用了一个预定义的CRC-16-CCITT多项式(0x1021)。对于每个输入字节,我们使用异或运算符将其与crc寄存器的高位进行异或操作,然后通过一个循环来处理每个位。如果crc寄存器的高位是1,我们使用异或运算符将其与多项式进行异或操作,然后将crc寄存器的值左移一位。否则,我们只将crc寄存器的值左移一位。最后,crc寄存器的值就是CRC校验值。
使用javascript,编写输入16进制字符串通过CRC16-CCITT方法计算出十六进制结果
你可以使用以下代码来计算输入的 16 进制字符串的 CRC16-CCITT 值:
```
function crc16(input) {
var crc = 0xFFFF;
var j, i;
input = input.toUpperCase();
for (i = 0; i < input.length; i++) {
crc = crc ^ input.charCodeAt(i);
for (j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ 0x8408;
} else {
crc = crc >> 1;
}
}
}
return crc.toString(16);
}
// 例如,计算字符串 "HELLO" 的 CRC16-CCITT 值
console.log(crc16("HELLO")); // 输出:"B4C8"
```
上面的代码使用了 16 进制计算,并将结果转换为 16 进制字符串。如果你想要输出十进制数,可以把 `crc.toString(16)` 改为 `crc.toString(10)`。