matlab实现CRC

适用于任何小于等于32位的CRC校验

function crcout = crcX(datain,tempstr,initdata,refin,refout,xorout)
%cala crc
%author ******
%parameter: initdata --xor the fisrt reg; refin --- the datain need reflect
%refout: out crc need reflect; xorout--- crc reg xor xorout
mcrctemp = uint32(bin2dec(tempstr));
len = length(tempstr);
size = length(datain);
for i = 0:(fix(len/8)+1)
    datain(end+1) = 0;
end
if refin ~= 0
    datain = reflect(datain , 8);
end
%andvalue = num2str(uint8(zeros(1,len+1)));
%andvalue(len+1) = '1';
andvalue = bitshift(1,len);
midout = uint32(0);
for i = 0:(((size*8)-1)+len)
    midout = bitshift(midout,1);  
    if bitand(datain((fix(i/8)+1)),bitshift(1,7-rem(i,8))) ~= 0
        midout = bitor(midout,1);
    end
    if i == len-1
        midout = bitxor(midout,initdata);
    end
    if bitand(midout,andvalue)~=0 
        midout = bitxor(midout,mcrctemp);
    end
%    dec2bin(midout)
end
if refout ~= 0
    midout = reflect(midout,len);
end
midout = bitxor(midout,xorout);
andvalue = bitshift(4294967295,len-32);
crcout = bitand(midout,andvalue);
end   
function outdata=reflect(data,bitnum)
%reflect this data
%paramter explain: bitnum reflect bit number
size=length(data);
outdata = zeros(1,size);
mvalue = bitshift(4294967295,bitnum);
for i = 1:size
    outdata(i) = data(i);
    outdata(i) = bitand(outdata(i),mvalue);
    for j=0:(bitnum-1)
        if bitand(data(i),bitshift(1,j)) ~= 0
            outdata(i) = bitor(outdata(i),bitshift(1,bitnum -1 - j));
        end
    end
end
end
  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值