uint16_t CRC16_Modbus(unsigned char *ptr, int len) { unsigned int i; uint16_t crc = 0xFFFF; while(len--) { crc ^= *ptr++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } } return crc; }
时间: 2024-03-29 15:39:12 浏览: 84
这是一个计算CRC16-Modbus校验值的函数,输入是一个指向unsigned char类型数组的指针和数组长度,输出是一个uint16_t类型的CRC校验值。
函数使用的是多项式为0xA001的CRC算法,该算法也被称为CRC16-IBM或CRC16-ANSI。具体实现方法是,首先将crc的初值设置为0xFFFF,然后对于每个字节,按位异或后再进行8次循环,每次循环将crc右移一位并根据最低位是否为1进行异或。循环结束后,crc的值即为该数组的CRC16-Modbus校验值。
该函数可以用于串行通信、网络通信等场合中数据完整性校验。
相关问题
uint16_t CRC16_Mbus( uint8_t *ptr, int len ) { unsigned int i; uint16_t crc = 0xFFFF; while(len--) { crc ^= *ptr++; for (i = 0; i < 8; ++i) { if (crc & 1) crc = (crc >> 1) ^ 0xA001; else crc = (crc >> 1); } } return crc; }将其改为CCITTCRC16
可以按照下面的方式修改代码以计算CCITT CRC16:
```c
uint16_t CRC16_CCITT(uint8_t *ptr, int len) {
uint16_t crc = 0xFFFF;
while (len--) {
crc ^= (*ptr++) << 8;
for (int i = 0; i < 8; ++i) {
if (crc & 0x8000) {
crc = (crc << 1) ^ 0x1021;
} else {
crc <<= 1;
}
}
}
return crc;
}
```
修改点包括:
1. 将初始值设置为0xFFFF。
2. 将每个字节(8位)左移8位,然后进行异或运算。
3. 将多项式设置为0x1021。
需要注意的是,CCITT CRC16 与 Modbus CRC16 算法不同,如果在通信中使用错误的算法进行校验,可能会导致通信错误。
16位 udp校验和计算低字节和高字节c++详细示例
在C++中,使用UDP校验和时,通常会使用一个简单的伪哈希函数如CRC16来计算。下面是一个详细的例子,展示如何计算16位UDP校验和,特别关注了低位和高位:
```cpp
#include <string.h> // 包含用于处理字节操作的库
// 使用标准的CRC16算法(对于大多数应用是XModem CRC)
unsigned short calculateChecksum(const char* data, size_t len) {
unsigned short crc = 0xFFFF; // 初始化校验和为最大值
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(data);
for (size_t i = 0; i < len; ++i) {
crc ^= *ptr++;
for (int j = 0; j < 8; ++j) { // 对每个数据位进行循环异或
if (crc & 0x0001)
crc = (crc >> 1) ^ 0xA001; // 根据表查找
else
crc >>= 1;
}
}
return ~crc; // 取反得到最终校验和(因为网络通信通常需要取反)
}
// 示例数据
char message[] = "Hello UDP Checksum Example";
size_t messageLength = strlen(message);
// 计算并显示校验和
unsigned short checksum = calculateChecksum(message, messageLength);
std::cout << "Low byte of the checksum: " << static_cast<unsigned char>(checksum & 0xFF) << std::endl;
std::cout << "High byte of the checksum: " << static_cast<unsigned char>((checksum >> 8) & 0xFF) << std::endl;
//
阅读全文