7.22日今日总结之CRC8校验
今日学习通讯协议时,发现客户的数据采用了CRC8校验,之前用的都是和校验或者异或校验,头次使用CRC8校验,因此上网查阅资料学习了一下。
CRC8校验一般使用的多项式为X8+X2+X1+1
CRC8算法是通过对数据进行模2除法运算来计算余数,也称异或运算,然后将余数附加到原始数据后面,形成被校验的数据。
具体流程如下:
1.选择一个校验多项式,多项式的位数决定了CRC8算法的性能,可以使用通用标准的多项式,也可以随意选择,但是最高位和最低位必须为1。如X8+X2+X1+1,对应的多项式为0x07(高位舍去)
2.因为需要 8 位 CRC 校验,所以将需要将待校验的数据左移 8 位,低位补0。
3.将待校验数据左移8位后与校验多项式二进制数按高位对齐,低位不够则补0的方式进行异或运算。
4.将上一步得到的结果的高位0全部去掉继续与校验多项式二进制数按高位对齐,低位不够则补0的方式进行异或运算。
5.重复上一步骤直到最终结果只有8位有效数据,即为计算得出的特征值(校验码)。
从网上COPY了一段程序并加以改进,并使用在线验证工具验证通过了
附上在线验证链接> http://www.ip33.com/crc.html
/*************************************************************
-
函数名称: Crc_8
-
函数功能: 生成crc8 密匙
-
入口参数: p_buffer 需要校验的数据首地址 buf_size:需要校验的数据的长度
-
返回参数: 生成的crc8 秘钥
-
说明:p_buffer的空间必须要要>=buf_size 此函数不负责检测数据溢出
************************************************************/
static unsigned char Crc_8( unsigned char p_buffer, unsigned char buf_size )
{
unsigned char crc = 0,i;
if(buf_size <= 0) //数据长度小于等于0则直接返回CRC=0
{
return crc;
}
while( buf_size-- )
{
for ( i = 0x80; i != 0; i /= 2 )
{
if (crc & 0x80) //判断最高位是否为1,最高位为1不需要异或,直接左移,然后再与0x07异或
{
crc = (crc<<1)^0x07; // 多项式:X8 + X2 + X + 1
}
else //最高位为0不需要异或,直接左移一位
{
crc<<1;
}if ( (*p_buffer & i) != 0 ) { crc ^= 0x07; } } p_buffer++;
}
return crc;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现