校验算法模块(crc.h/.c)
提供常用CRC16/CRC32算法,接口简洁,便于移植。
- // crc.h
- #ifndef CRC_H
- #define CRC_H
- #include <stdint.h>
- uint16_tcrc16_ccitt(const uint8_t *data, uint32_t len, uint16_t init);
- uint32_tcrc32_simple(const uint8_t *data, uint32_t len, uint32_t init);
- #endif
- // crc.c
- #include "crc.h"
- uint16_tcrc16_ccitt(const uint8_t *data, uint32_t len, uint16_t init) {
- uint16_t crc = init;
- for (uint32_t i = 0; i < len; ++i) {
- crc ^= (uint16_t)data[i] << 8;
- for (int j = 0; j < 8; ++j)
- crc = (crc & 0x8000) ? (crc << 1) ^ 0x1021 : (crc << 1);
- }
- return crc;
- }
- uint32_tcrc32_simple(const uint8_t *data, uint32_t len, uint32_t init) {
- uint32_t crc = init;
- for (uint32_t i = 0; i < len; ++i) {
- crc ^= data[i];
- for (int j = 0; j < 8; ++j)
- crc = (crc & 1) ? (crc >> 1) ^ 0xEDB88320 : (crc >> 1);
- }
- return crc;
- }
|