crc16校验程序源码
时间: 2024-11-09 18:03:08 浏览: 8
CRC (Cyclic Redundancy Check) 16位校验是一种常用的数据完整性检查算法,它计算数据的一个短小、固定长度的校验值,用于检测传输过程中是否有误。以下是简单的CRC16校验程序的Python示例源码:
```python
def crc16(data, polynomial=0x1021):
"""Calculate CRC-16 using the CRC-16-MODBUS polynomial."""
register = ~0xFFFF # 初始化寄存器为全1
for byte in data:
shifted_register = register >> 8
register ^= shifted_register & polynomial
register ^= byte << 8
return register & 0xFFFF
# 使用示例
data = b'\x00\x11\x22\x33'
computed_crc = crc16(data)
print(f"原始数据: {data.hex()}")
print(f"CRC-16值: {computed_crc:04X}")
相关问题
STM32crc16校验程序源码
STM32单片机中使用CRC16校验通常涉及到编写计算循环冗余校验(CRC)值的函数,这是一种常见的错误检测技术。以下是一个简单的STM32F103系列C语言实现的CRC16校验程序源码示例:
```c
// 定义CRC16算法表
const uint16_t CRC_TABLE[256] = {
// 略去生成表格的部分,由于长度较长这里省略
};
// STM32 CRC16函数
uint16_t crc16(uint8_t *data, uint16_t len)
{
uint16_t crc = 0xFFFF; // 初始化CRC值
uint8_t poly = 0x1021; // 使用X.128 CRC polynomial
for (uint16_t i = 0; i < len; ++i)
{
crc = (crc >> 8) ^ CRC_TABLE[(crc ^ data[i]) & 0xFF]; // 根据表查找当前位的结果
}
return ~crc; // 取反得到实际的CRC值,因为STM32库通常期望输入是低字节在前
}
// 示例用法
void main(void)
{
uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04}; // 待校验的数据
uint16_t crc;
// 计算并打印CRC值
crc = crc16(buffer, sizeof(buffer)/sizeof(buffer[0]));
printf("CRC16 Checksum: %04X\n", crc);
阅读全文