用c编写CRC-16-CCITT 生成多项式为g(x) = x^16+x^12+x^5+1
时间: 2023-05-22 19:06:06 浏览: 178
以下是用C语言编写CRC-16-CCITT的代码,生成多项式为g(x) = x^16 x^12 x^5 1:
```c
#include <stdint.h>
#include <stdio.h>
#define POLY 0x1021
uint16_t crc16_ccitt(const uint8_t *data, int len) {
uint16_t crc = 0xFFFF;
for (int i = 0; i < len; ++i) {
crc ^= ((uint16_t)data[i] << 8);
for (int 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};
uint16_t crc = crc16_ccitt(data, sizeof(data)/sizeof(uint8_t));
printf("CRC-16-CCITT checksum: 0x%04x\n", crc);
return 0;
}
```
关于中文加密这个问题,可能需要更具体的问题描述才能给出准确的答案。
相关问题
帮我写一份基于C语言的CEC校验,规范是CRC-CCITT,多项式: 1021h=X16+X12+X5+1 (LSB第一模式),
以下是基于C语言的CEC校验代码,采用CRC-CCITT规范,多项式为1021h,LSB第一模式:
```c
#include <stdio.h>
#include <stdint.h>
#define POLY 0x1021
uint16_t crc_ccitt(uint8_t *data, int len)
{
uint16_t crc = 0xFFFF;
for (int i = 0; i < len; i++)
{
crc ^= (uint16_t)data[i] << 8;
for (int 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, 0x05};
int len = sizeof(data) / sizeof(data[0]);
uint16_t crc = crc_ccitt(data, len);
printf("CRC-CCITT: %04X\n", crc);
return 0;
}
```
在这个例子中,我们使用了一个名为`crc_ccitt()`的函数来计算CRC-CCITT校验和。该函数接受一个指向数据缓冲区的指针和数据长度作为输入,并返回CRC-CCITT校验和。
该函数使用一个名为`crc`的16位寄存器来存储校验和。它首先将0xFFFF存储在`crc`中,然后将每个字节数据作为输入按位计算CRC。在每个字节的位运算中,它将`crc`和输入数据异或,并每次处理8个位。如果最高位是1,它将执行除法并将多项式0x1021异或到CRC中;否则,它只是将CRC向左移动一位。最后,该函数返回计算得到的CRC-CCITT校验和。
在主函数中,我们使用一个名为`data`的数组来存储输入数据。我们计算数据的CRC-CCITT校验和,并将结果打印到控制台上。
CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入反转 输出反转,CRC-16/CCITT x16 + x12 + x5 + 1 16 1021 0000 0000 true true,帮我做成表格
我可以为您提供一个CRC-16/CCITTx16的表格:| 公式宽度 | 多项式初始值 | 结果异或值 | 输入反转 | 输出反转 |
| :------: | :----------: | :----------: | :---------: | :---------: |
| x12 | x5 | 1161021 | true | true |
阅读全文