浅谈crc32反转与不反转的公式理解

您所在的位置:网站首页 j1850参数 浅谈crc32反转与不反转的公式理解

浅谈crc32反转与不反转的公式理解

2024-07-11 21:11| 来源: 网络整理| 查看: 265

List item CRC闲谈

此处介绍为CRC_32查表法的代码解释,个人理解,非专业

设置一个4字节数据,每字节分别设置为a ,b, c, d,当前数据为a b c d a b c d分别为16进制数据

多项式为:04C11DB7

初始值为:0xFFFFFFFF

首先声明CRC支持结合律,这个网上搜,不再介绍,也可自己实践

a b c d

按照手算方法,是一位一位的移动,是零忽略,是一 移位,和04C11DB7异或

Crc_32输入输出不反转介绍

查表法 声明:下面的x?仅代表第几个byte,不涉及数据 第一步 先算a ,忽略b c d 算出来的应该为 在这里插入图片描述

ax1 ax2 ax3 ax4 为a对应的CRC,记作a’,a’可以通过查表获得

则此项可以看做 在这里插入图片描述

第二步 然后算b的CRC 在这里插入图片描述

因为受到a’的影响 b这项的数据应为b xor ax1,记作b1,则b1=(a’>>24) xor b ,只需要取一个字节,即b1=((a’>>24) xor b) & 0xff

则得出的数据应为 在这里插入图片描述

如上所示: 因为a’的影响,此crc并不完全,合并运算b运算完成后的crc第一位依次为应该为 ax2 xor b1x1 ax3 xor b1x2 ax4 xor b1x3 b1x4 即b’=b1’ xor (a’ 24) xor c) & 0xff,c’=c1’ xor (b’ 24)^data[i]) & 0xff] ^ (crc >24)^data[i]) & 0xff]代表查表法出来的数据,b1’,其中crc代表上次的crc,a’.

下附代码

//下面代码中dword相当于unsigned int dword Crc32Table[256]; dword bitrev( dword input, int bw)//位反转 { int i; dword var; var = 0; for(i=0;i> 1; } } Crc32Table[i] = bitrev(c,32); } } dword crc32(byte data[], dword len)//输入byte数组data[],len为data[]的长度 { dword i =0; for (i = 0; i >24)^data[i]) & 0xff] ^ (crc 8); 其中Crc32Table[(crc ^ data[i]) & 0xff]为查表得出的数据,b*’,crc 为上次的crc,a*’ . 这个公式的意思是:(crc ^ data[i]) & 0xff根据当前data[i]的值算出受上个byte传来的crc影响后的数据crc ^ data[i],因为一个byte只有8bit,所以& 0xff 根据b*’=(a*’>>8) xor b*,对应出来的为Crc32Table[(crc ^ data[i]) & 0xff] ^ (crc >> 8)即为当前crc反转的值

代码如下

dword Crc32Table[256]; dword bitrev( dword input, int bw)//反转 { int i; dword var; var = 0; for(i=0;i> 1; } } Crc32Table[i] = c; } } dword crc32(byte data[], dword len)//输入反转,输出反转 { dword i =0; for (i = 0; i > 8); } writeLineEx(mNewPage,1,"CRC %08x",crc); return crc; }

以上仅仅是个人的见解,与实际文档可能存在差距,仅供参考,如有转载,请备注链接。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3