常用CRC16校验自动补充函数

该代码实现了CRC16-IBM校验算法,用于数据完整性验证。函数IBM_CRC16计算CRC值,data_CRC16_make则将校验码添加到数据数组尾部,支持高位或低位在前两种格式。注意防止内存越界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define LOW_FRONT                   0x00

//CRC16-IBM 校验,初始值0x0000,多项式8005
//计算结果输出高位在左低位在右,使用时注意顺序
u16 IBM_CRC16(u8 *buf,u8 length)//CRC16计算
{
  u8 i;
  u16 crc=0x0000;//CRC寄存器初始值0x0000
  while(length--)
    for(crc^=*(buf++),i=0;i<8;i++)
      crc=(crc&0x0001)?(crc>>1)^0xA001:crc>>1;
  return crc;
}

//对数据进行CRC校验,然后按输入参数将校验码补充到原数组尾部
//* data 要校验的数组指针, len要校验的数据长度
//pad_type: 校验码补充方式,1,高位在前;0,低位在前
void data_CRC16_make(u8* data, u8 len, u8 pad_type)
{
    u16 crc_tmp = IBM_CRC16(data,len);//对接收到的数据进行CRC校验
    u8 tmp_L = (crc_tmp>>0)&0xff;
    u8 tmp_H = (crc_tmp>>8)&0xff;
    printf("crc res: %04x\r\n",crc_tmp);
    if(pad_type == LOW_FRONT)
    {
        data[len] =  tmp_L;
        data[len+1] =  tmp_H;
    }
    else
    {
         data[len] =  tmp_H;
         data[len] =  tmp_L;   
    }
}

注意,指针指向的数组空间必须足够,否则会内存越界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值