CRC初始移位寄存器全1设置与消息前n位取反等价性验证问题
错误原因
你对等价表述的理解存在偏差,全1初始移位寄存器的CRC计算,并不是等价于直接对原始消息的前n位取反,其等价操作的数学推导如下:
设消息多项式为M(x),长度为L比特,生成多项式为G(x),阶数为n,全1初始值对应的多项式为S(x) = x^{n-1} + x^{n-2} + ... + 1 = 2^n - 1。
全1初始CRC的计算过程等价于求解:(S(x) * x^L + M(x) * x^n) mod G(x)
而你代码中直接对消息前n位取反的操作,对应的是求解:((M(x) + (2^n - 1)*x^{L-n}) * x^n) mod G(x),二者显然不相等,这就是你得到结果不一致的核心原因。
正确的等效验证代码
你可以用如下修改后的MATLAB代码验证等价性:
x = [0 1 0 1 0 1 1 1]; div = [1 0 0 0 0 0 1 1 1]; n = length(div)-1; L = length(x); % 方法1:移位寄存器初始全1 x0 = [x zeros(1,n)]; rem0 = ones(1,n); for k = 1:length(x0) rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1)); end disp('方法1结果:') disp(rem0) % 方法2:等效操作,初始寄存器为0,叠加全1初始值的影响 x0 = [x zeros(1,n)]; rem0 = zeros(1,n); % 前n次移位叠加初始全1的作用 for k = 1:n rem0 = bitxor([rem0(2:n) x0(k)], bitxor(rem0(1),1)*div(2:n+1)); end % 后续移位正常计算 for k = n+1:length(x0) rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1)); end disp('方法2结果:') disp(rem0)
运行后两种方法得到的结果完全一致,可以证明原表述是成立的,只是你的等效实现方式存在错误。
内容的提问来源于stack exchange,提问作者Jose Marcelo Lima Duarte
相关产品推荐
相关产品推荐

