先學習一下matlab中CRC函數。
語法如下:
h = crc.generator(‘Polynomial', polynomial, ‘param1', val1, etc.)
再看一個例子就比較好容易理解,
% Construct a CRC generator with a polynomial defined % by x^3+x+1, with zero initial states, % and with an all-ones final XOR value: h = crc.generator('Polynomial', [1 0 1 1], ... 'InitialState', [0 0 0], ... 'FinalXOR', [1 1 1])
Polynomial指的是CRC的生成多項式,上面的是二進制表示,同樣可以用十六進制表示'0xb',和上面是等效的,InitialState指的是CRC的初始值,FinalXOR指的是最后的輸出需不需要做異或,如果為全零其實就是保持原來的值,全1表示為把結果取反。
這里還有幾個參數也按我的理解說一下。ReflectInput這是個布爾變量,當它為true時,進入移位寄存器是按byte進去的,所以要求多項式的長度必須是8的倍數。它的default值是false。
我項目中需要的一個例子如下:
h = crc_generator('Polynomial',[1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1],'InitialState',[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],'FinalXOR',[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]);
%這個多項式為x^16+x^15+x^2+1,注意后面'InitialState'和'FinalXOR'的值都是16個0.
crc_din = 3;%這里是十進制,而且可以用load一個文件后面的幾行就是為了load一個文件而處理的
crc_din_bi = de2bi(crc_din,2);%轉換成2位的二進制,后面的2指的是2位
crc_din_trans = transpose(crc_din_bi);%這個函數的意思就是把crc_din_bi這個矩陣翻轉,比如原來crc_din_bi是一個1x2的矩陣,翻轉后變成2x1,前面是行數,后面是列數
crc_din_trans_reshape = reshape(crc_din_trans,[],1);%中間是一個方括號。reshaple的意思是把一個矩陣串起來,按照一列串起來
encoded = generate(h,crc_din_trans_reshape);%執行CRC
這個程序運行的結果是
1%原數據
1%原數據
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
后面16位就是輸出的CRC值,其實就是0xa
如果要輸出一個文件
fid = fopen('crc_out.txt','w+');
for cnt = 1 : size(encoded,1)
fprintf(fid,'%-d\n',encoded(cnt));
end
fclose(fid;)