crc-16 校验 代码
时间: 2024-05-13 22:11:40 浏览: 19
CRC-16校验是一种常用的数据传输校验方式,其通过对数据进行多项式求模的方式生成一个固定长度的校验码,以检测数据在传输过程中是否出现错误。其计算方式可以采用硬件电路实现,也可以在软件中实现。下面是一个C语言实现的CRC-16校验代码,供您参考:
```c
unsigned short crc16(unsigned char *data, int length) {
unsigned short crc = 0xFFFF;
int i, j;
for (i = 0; i < length; i++) {
crc ^= (unsigned short)data[i];
for (j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
} else {
crc >>= 1;
}
}
}
return crc;
}
```
该函数接收一个指向数据缓冲区和数据长度的指针作为参数,并返回计算出的CRC-16校验值。该函数采用了X16+X15+X2+1多项式(0xA001),并按照字节顺序进行了位序翻转(LSB first)处理。
相关问题
c++ 实现CRC-16 校验
以下是C++实现CRC-16校验的示例代码:
```c++
#include <iostream>
using namespace std;
unsigned short crc16(unsigned char *data, unsigned int length, unsigned short crc)
{
const unsigned short polynomial = 0x1021;
unsigned short crc_register = crc;
for (unsigned int i = 0; i < length; i++)
{
for (unsigned char bit = 0x80; bit > 0; bit >>= 1)
{
bool c15 = crc_register & 0x8000;
bool bit_in = data[i] & bit;
crc_register <<= 1;
if (bit_in != 0)
crc_register |= 0x0001;
if (c15 != 0)
crc_register ^= polynomial;
}
}
return crc_register;
}
int main()
{
unsigned char data[] = {0x01, 0x02, 0x03, 0x04};
unsigned int length = sizeof(data);
unsigned short crc = 0x0000;
unsigned short crc_result = crc16(data, length, crc);
cout << "CRC-16校验结果为:" << hex << crc_result << endl;
return 0;
}
```
其中,crc16函数接受三个参数:待校验数据的指针,数据长度和初始CRC值。在函数内部,我们使用了CRC-16的标准生成多项式0x1021进行计算,最后返回计算出的CRC校验值。在main函数中,我们将待校验数据赋值给data数组,调用crc16函数计算CRC-16校验值,并输出结果。
java实现crc-16校验
可以使用Java自带的Checksum类来实现CRC-16校验。具体代码如下:
```java
public static int crc16(byte[] bytes) {
int crc = 0xFFFF;
int polynomial = 0x1021;
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7 - i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit) crc ^= polynomial;
}
}
crc &= 0xffff;
return crc;
}
```
该方法接受一个字节数组作为参数,返回CRC-16校验值。