• 大小: 6KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: Matlab
  • 标签: crc32  ieee  eth  cksum  matlab  

资源简介

CRC32计算程序,生成多项式是: G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 该生成多项式是IEEE的标准,应用在ETH,wifi等多个协议里面。 电脑上的文件校验工具,也基本采用这个crc32. 用matlab实现,带注释。 包含little-endian、big-endian算法,已及相应的查表算法。 此外,还专门针对cksum、hashcalc这两个常见的校验软件,写了计算例子。 如果还在疑惑为什么cksum和crc32、hashcalc的结果不一样,建议看一下这个程序。

资源截图

代码片段和文件信息

function cksum
test1;
test2;
test3;
test4;
crctab = gen_tbl_le();
crctab = gen_tbl_be();


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 1 little endian just like HashCalc.exe
function test1

msg  = [‘02‘; ‘02‘; ‘58‘; ‘60‘;
        ‘23‘; ‘5A‘; ‘3D‘; ‘6F‘; 
        ‘EA‘; ‘84‘; ‘E7‘; ‘AA‘; 
        ‘6C‘; ‘13‘; ‘E4‘; ‘15‘; 
        ‘EB‘; ‘D8‘; ‘C2‘; ‘34‘; 
        ‘A5‘; ‘12‘ ];
ccc  = [‘D8‘; ‘8B‘; ‘5D‘; ‘84‘];

msg  = de2bi(hex2dec(msg) 8 ‘left-msb‘);
ccc  = de2bi(hex2dec(ccc) 8 ‘left-msb‘);

% generate crc
crc = crc32_le(ones(132) msg);
crc = 1-crc(32:-1:1);
crc_hex = dec2hex(bi2de(crc)); % 845D8BD8
disp(crc_hex);

% check crc
crc = crc32_le(ones(132) [msg; ccc]);
crc_hex = dec2hex(bi2de(crc)); % C704DD7B
disp(crc_hex);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 2 big endian ieee eth spec example
function test2

msg  = [‘40‘; ‘40‘; ‘1A‘; ‘06‘; 
        ‘C4‘; ‘5A‘; ‘BC‘; ‘F6‘; 
        ‘57‘; ‘21‘; ‘E7‘; ‘55‘; 
        ‘36‘; ‘C8‘; ‘27‘; ‘A8‘; 
        ‘D7‘; ‘1B‘; ‘43‘; ‘2C‘; 
        ‘A5‘; ‘48‘ ];
ccc  = [‘1B‘; ‘D1‘; ‘BA‘; ‘21‘];

msg  = de2bi(hex2dec(msg) 8 ‘left-msb‘);
ccc  = de2bi(hex2dec(ccc) 8 ‘left-msb‘);

% generate crc
crc = crc32_be(ones(132) msg);
crc = 1-crc(32:-1:1);
crc_hex = dec2hex(bi2de(crc)); % 1BD1BA21
disp(crc_hex);

% check crc
crc = crc32_be(ones(132) [msg; ccc]);
crc = crc(32:-1:1);
crc_hex = dec2hex(bi2de(crc)); % C704DD7B
disp(crc_hex);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 3 methord of linux coreutil cksum
function test3

msg  = [‘40‘; ‘40‘; ‘1A‘; ‘06‘; 
        ‘C4‘; ‘5A‘; ‘BC‘; ‘F6‘; 
        ‘57‘; ‘21‘; ‘E7‘; ‘55‘; 
        ‘36‘; ‘C8‘; ‘27‘; ‘A8‘; 
        ‘D7‘; ‘1B‘; ‘43‘; ‘2C‘; 
        ‘A5‘; ‘48‘ ];

len  = size(msg 1);
lenhex = [];
while len>0
  tmp = mod(len 256); % len & 0xFF
  len = bitshift(len -8); % len>>8
  lenhex = [lenhex; dec2hex(tmp 2)];
end

len  = size(msg 1);
msg  = [msg; lenhex]; % calc crc32 include length
msg  = de2bi(hex2dec(msg) 8 ‘left-msb‘);

% generate crc
crc = crc32_be(zeros(132) msg);

crc_dec = bi2de(1-crc(32:-1:1));
disp(sprintf(‘%d %d filename‘ crc_dec len));


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% test 3 compare width table methord
function test4

% little endian
msg  = [‘02‘; ‘02‘; ‘58‘; ‘60‘;
        ‘23‘; ‘5A‘; ‘3D‘; ‘6F‘; 
        ‘EA‘; ‘84‘; ‘E7‘; ‘AA‘; 
        ‘6C‘; ‘13‘; ‘E4‘; ‘15‘; 
        ‘EB‘; ‘D8‘; ‘C2‘; ‘34‘; 
        ‘A5‘; ‘12‘ ];
msg  = de2bi(hex2dec(msg) 8 ‘left-msb‘);
crc1 = crc32_le(ones(132) msg);
crc2 = crc32_le_tbl(ones(132) msg);
crc1_hex = dec2hex(bi2de(1-crc1(32:-1:1)));
crc2_hex = dec2hex(bi2de(1-crc2(32:-1:1)));
disp([crc1_hex ‘  ‘ crc2_hex]);

% big endian
msg  = [‘40‘; ‘40‘; ‘1A‘; ‘06‘; 
        ‘C4‘; ‘5A‘; ‘B

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5651  2013-06-20 11:49  crc32.m
     文件       12824  2013-06-21 13:34  cksum.m

评论

共有 条评论