CHECKSUM TOOLKIT
CRC 校验
输入数据、调整参数,即时获得多种格式的校验结果。
↻CRC-16/MODBUS
01输入数据
02算法参数
“123456789”校验值 4B3703计算结果
实时更新十六进制 · 高位在左4B 37
Hex · 低位在左
37 4B十进制
19255二进制
01001011 00110111字节序提示 通讯协议常见低位在前,请以设备协议定义为准。
C参考 C 函数随当前参数生成
/* CRC-16/MODBUS:逐位纯软件实现 */
#include <stddef.h>
#include <stdint.h>
typedef uint16_t crc_t;
#define CRC_WIDTH 16U
#define CRC_POLY ((crc_t)0x8005U)
#define CRC_POLY_REFLECTED ((crc_t)0xA001U)
#define CRC_INIT ((crc_t)0xFFFFU)
#define CRC_XOROUT ((crc_t)0x0000U)
#define CRC_MASK ((crc_t)0xFFFFU)
#define CRC_TOPBIT ((crc_t)1U << (CRC_WIDTH - 1U))
static crc_t crc_reflect(crc_t value)
{
crc_t result = 0;
for (unsigned bit = 0; bit < CRC_WIDTH; ++bit) {
if ((value & ((crc_t)1U << bit)) != 0U)
result |= (crc_t)1U << (CRC_WIDTH - 1U - bit);
}
return result;
}
crc_t crc_calculate(const uint8_t *data, size_t length)
{
crc_t crc = CRC_INIT;
for (size_t i = 0; i < length; ++i) {
for (unsigned bit = 0; bit < 8U; ++bit) {
uint8_t mix = (uint8_t)((crc ^ (data[i] >> bit)) & 1U);
crc >>= 1U;
if (mix != 0U) crc ^= CRC_POLY_REFLECTED;
}
}
return (crc_t)((crc ^ CRC_XOROUT) & CRC_MASK);
}参考实现采用标准 C99 类型。256 项表已按当前参数预生成,可直接调用计算函数。
快速说明
Hex 输入可使用空格、逗号或换行分隔。CRC 参数采用标准模型定义;数码管工具支持字符正推、点击段位反推和段码译码,共阳模式会自动反转输出电平。