我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1135|回复: 2

[技术文章] 支持分包计算CRC32的源码分享

[复制链接]

该用户从未签到

5

主题

4

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2020-8-14 16:38:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/*
在单片机(ARM)OTA时经常会用到CRC来校验接收文件的正确性,由于接收是分包的,整个包内容是否正确,可以通过每接收一包进行一次校验
直到所有包接收完成,也可以在所有数据接收完成后,从flash中一次性计算,但是都面临分包计算的过程,除非单片机内存足够大,所以我们还
是不要去想不太现实的事实,就用下面这个计算函数吧。
*/
unsigned int Xcrc32(unsigned int crc, const void *base, unsigned int len)
{
    unsigned int crc32 = 0;
    unsigned char *p = (unsigned char *)base;
    const unsigned int table[16] = {
        0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 0x76DC4190, 0x6B6B51F4, 0x4DB26158, 0x5005713C,
        0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C, 0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C
    };

        crc32 = table[(crc ^  *p        ) & 0x0F] ^ (crc >> 4);
    crc32 = table[(crc32 ^ (*p++ >> 4)) & 0x0F] ^ (crc32 >> 4);
        len--;
    while (len--) {
        crc32 = table[(crc32 ^  *p        ) & 0x0F] ^ (crc32 >> 4);
        crc32 = table[(crc32 ^ (*p++ >> 4)) & 0x0F] ^ (crc32 >> 4);
    }
    return crc32;
}
回复

使用道具 举报

该用户从未签到

87

主题

1136

回帖

2478

积分

PADS-241024高级班

积分
2478

终身成就奖

发表于 2020-8-27 22:58:15 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

11

主题

41

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2020-9-22 09:29:13 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

每日签到,有金币领取。


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表