[英]Mathematical equivalent of setting the CRC initial shift register value to all ones
我已經讀過,最初將 CRC 余數移位寄存器設置為全 1 在數學上等效於對消息的前n位進行補碼(非二進制),其中n是移位寄存器長度。 我發現這個聲明https://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks#Preset_to_%E2%88%921 ,並在部分21.3.7 IEEE 802.11ad標准規范,如呈現在這里。
但是,我嘗試在 MATLAB 中驗證這一點,但沒有成功。 是我做錯了什么,還是這個陳述實際上是錯誤的? 對我來說似乎是假的。
x = [0 1 0 1 0 1 1 1];
div = [1 0 0 0 0 0 1 1 1];
n = length(div)-1;
% CRC with bit shift strategy
% Set REM shift register initial state to all '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(rem0)
% CRC with bit shift strategy
% Complement initial n bits
x0 = [bitxor(x, ones(1,8)) zeros(1,8)];
rem0 = zeros(1,n);
for k = 1:length(x0)
rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1));
end
disp(rem0)
% CRC Division strategy
% complement initial n
x0 = bitxor(x, ones(1,n));
rem0 = [x0 zeros(1,n)];
for k = 1:length(x0)
if rem0(k)==1
rem0(k:k+n)=bitxor(rem0(k:k+n), div);
end
end
disp(rem0(end-n+1:end))
這導致0111_0101
用於移位寄存器的初始狀態設置為1和在的情況下0101_0001
為其他兩種情況我補充輸入字的初始n位。
他們談論的初始移位寄存器值不是您的初始rem0
。
請注意,如果您不想反轉任何內容,例如:
% CRC with bit shift strategy
x0 = [x zeros(1,n)];
rem0 = zeros(1,n);
for k = 1:length(x0)
rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1));
end
disp(rem0)
您正在執行循環的 16 次迭代,其中前八次僅將x
移入rem0
。 所以我們可以改為將rem
設置為x
,然后進行最后八次迭代:
% CRC with fewer bit shifts strategy
rem0 = x;
for k = 1:length(x)
rem0 = bitxor([rem0(2:n) 0], rem0(1)*div(2:n+1));
end
disp(rem0)
這更接近於通常的實現,現在我們有了他們談論的初始rem0
。 它最終看起來像這樣:
% CRC with fewer bit shifts strategy
rem0 = zeros(1,n);
rem0 = bitxor(rem0, x);
for k = 1:length(x)
rem0 = bitxor([rem0(2:n) 0], rem0(1)*div(2:n+1));
end
disp(rem0)
其中rem0
的初始化發生一次,其余的重復多個字節( x
)。
現在你可以看到當你想用一個初始化時,第一個x
:
rem0 = ones(1,n);
rem0 = bitxor(rem0, x);
實際上等同於:
rem0 = zeros(1,n);
rem0 = bitxor(rem0, bitxor(x, ones(1,n)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.