CRC16校验码如何计算

发布网友 发布时间:2022-04-22 01:07

我来回答

6个回答

懂视网 时间:2022-04-09 07:59

unsigned short CRC16_Modbus ( unsigned char *pdata, int len)
{
unsigned short crc=0xFFFF;
int i, j;
for ( j=0; j<len;j++)
{
crc=crc^pdata[j];
for ( i=0; i<8; i++)
{
if( ( crc&0x0001) >0)
{
crc=crc>>1;
crc=crc^ 0xa001;
}
else
crc=crc>>1;
}
}
return crc;
}

Modbus总线CRC16效验算法C语言

标签:

热心网友 时间:2022-04-09 05:07

首先G(X)=X3+X+1可以得出G(x)=1011[G(x)中的1就是二进制第0位为1,X就是第一位为1,没有X^2,所以第二位为0,X^3则第三位为1。所以就是1011]

M(x)=0011M(x)*x3=0011000

M(x)*x3/G(x)的余数是101所以R(X)=101

CRC码为:M(x)*x3+R(x)=0011000+010=0011010

在计算机网络通信中

运用CRC校验时相对于其他校验方法就有一定的优势。CRC可以高比例的纠正信息传输过程中的错误,可以在极短的时间内完成数据校验码的计算,并迅速完成纠错过程,通过数据包自动重发的方式使得计算机的通信速度大幅提高,对通信效率和安全提供了保障。由于CRC算法检验的检错能力极强,且检测成本较低,因此在对于编码器和电路的检测中使用较为广泛。

以上内容参考:百度百科-CRC

热心网友 时间:2022-04-09 06:25

7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E

方法如下:
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0), 之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。
1.设置CRC寄存器,并给其赋值FFFF(hex)。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。
CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。

参考资料:http://ke.baidu.com/view/80377.htm#2

热心网友 时间:2022-04-09 08:00

CRC16区分很多种的呀,你要的是哪一种?

"7E000560313233" (hex)

1 byte checksum 121
CRC-16 0xBD48
CRC-16 (Modbus) 0xBD53
CRC-16 (Sick) 0xA4
CRC-CCITT (XModem) 0x5B3E
CRC-CCITT (0xFFFF) 0xAAF0
CRC-CCITT (0x1D0F) 0x434C
CRC-CCITT (Kermit) 0xA572
CRC-DNP 0xC9B2
CRC-32 0xA5F4B6BB
之前wengshl回答是
CRC-CCITT (XModem) 0x5B3E

热心网友 时间:2022-04-09 09:51

13355459880,999000.

热心网友 时间:2022-04-09 11:59

校验的串呢? crc要根据你的串生成一个校验串的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com