C++ CRC实现代码中mod2div函数std::string(pick, '0')作用咨询
CRC算法mod2div函数逻辑详解
前置说明
本次示例使用的测试数据:
- 待编码数据
data = 1010101010 - CRC密钥
key = 11001(长度为5)
CRC运算的核心是模2除法,规则是无进位借位,按位做异或运算,最终得到的余数就是CRC校验值。mod2div函数的作用就是实现这个模2除法,返回余数。
std::string(pick, '0') 作用说明
这是C++标准库std::string的填充构造函数:
- 第一个参数是生成字符串的长度,第二个参数是用于填充的字符
- 此处作用是生成一个长度为
pick、所有字符都为'0'的字符串 - 业务逻辑层面:模2除法中只有当前运算的临时值最高位为
1时,才需要和除数做异或;如果最高位为0,这一步等价于和全0串做异或,结果和原临时值去掉最高位的部分完全一致,用这种写法可以统一两种分支的代码逻辑,避免冗余。
mod2div 函数逐逻辑讲解
我们先明确示例中函数的入参:
- 被除数
divident是原数据补key长度-1个0后的结果,即10101010100000,总长度14 - 除数
divisor就是密钥11001,长度5
函数执行步骤:
- 初始化:
pick赋值为除数长度5,取被除数前5位赋值给临时变量tmp,即tmp = 10101,被除数总长度n=14 - 进入循环(循环条件:
pick < 14,对应还没带完被除数的所有位):- 若
tmp第一位为1:用tmp和除数做异或,异或结果拼接当前pick指向的被除数下一位字符,赋值给新的tmp - 若
tmp第一位为0:用tmp和长度为pick的全0串做异或,异或结果拼接当前pick指向的被除数下一位字符,赋值给新的tmp pick自增1,继续下一轮循环
- 若
- 循环结束后,已经带完了被除数的所有位,再做最后一次异或处理,得到最终的余数
- 返回余数,也就是CRC校验值
补充说明xor1函数的配合逻辑:
xor1函数遍历是从下标1开始的,所以每次异或运算都会自动丢弃最高位,返回结果长度为pick-1,拼接一位新的被除数字符后刚好回到pick长度,完美对应手工计算模2除法时「左移一位带下一位」的操作。
内容的提问来源于stack exchange,提问作者Aditya kumar
相关产品推荐
相关产品推荐

