CRC(循环冗余校验)计算工具

CRC(循环冗余校验)计算工具,第1张

CRC(循环冗余校验)在线计算工具地址: http://xnkiot.com/#/crc

使用方法:

步缓冲滚骤:1、输入报文,并点击 校扰余验 按钮

步骤2:判谈系统输出CRC(循环冗余校验)校验结果

long int GenerateChecksumCRC24_D32(unsigned long ulNumValues,unsigned long *pulData)

{

unsigned long i,ulData,lfsr = 0xFFFFFF

for (i= 0x0i <ulNumValuesi++)

{

ulData = pulData[i]

lfsr = CRC24_D32(lfsr,ulData)

}

return lfsr

}

static unsigned long CRC24_D32(const unsigned long old_CRC, const unsigned long Data)

{

unsigned long D [32]

unsigned long C [24]

unsigned long NewCRC [24]

unsigned long ulCRC24_D32

unsigned long int f, tmp

unsigned long int bit_mask = 0x000001

tmp = 0x000000

// Convert previous CRC value to binary.

bit_mask = 0x000001

for (f = 0f <= 23f++)

{

C[f] = (old_CRC &bit_mask) >>f

bit_mask = bit_mask <<1

}

// Convert data to binary.

bit_mask = 0x000001

for (f = 0f <= 31f++)

{

D[f] = (Data &bit_mask) >>f

bit_mask = bit_mask <<1

}

// Calculate new LFSR value.

NewCRC[0] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^

D[24] ^ D[23] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^

C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^

C[22] ^ C[23]

NewCRC[1] = D[23] ^ D[18] ^ D[0] ^ C[10] ^ C[15]

NewCRC[2] = D[24] ^ D[19] ^ D[1] ^ C[11] ^ C[16]

NewCRC[3] = D[25] ^ D[20] ^ D[2] ^ C[12] ^ C[17]

NewCRC[4] = D[26] ^ D[21] ^ D[3] ^ C[13] ^ C[18]

NewCRC[5] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[26] ^ D[25] ^ D[24] ^

D[23] ^ D[22] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[2] ^

C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[14] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[20] ^ C[21] ^ C[22] ^

C[23]

LFSR代码示例

签名数友散是一个多项薯氏式为x24+ x23+ x6

+ x5

+x+1的24位CRC。初始值为告枯0xFFFFFF。

AN-1160

Rev. A | Page 7 of 8

NewCRC[6] = D[28] ^ D[18] ^ D[5] ^ D[0] ^ C[10] ^ C[20]

NewCRC[7] = D[29] ^ D[19] ^ D[6] ^ D[1] ^ C[11] ^ C[21]

NewCRC[8] = D[30] ^ D[20] ^ D[7] ^ D[2] ^ C[12] ^ C[22]

NewCRC[9] = D[31] ^ D[21] ^ D[8] ^ D[3] ^ C[0] ^ C[13] ^ C[23]

NewCRC[10] = D[22] ^ D[9] ^ D[4] ^ C[1] ^ C[14]

NewCRC[11] = D[23] ^ D[10] ^ D[5] ^ C[2] ^ C[15]

NewCRC[12] = D[24] ^ D[11] ^ D[6] ^ C[3] ^ C[16]

NewCRC[13] = D[25] ^ D[12] ^ D[7] ^ C[4] ^ C[17]

NewCRC[14] = D[26] ^ D[13] ^ D[8] ^ C[0] ^ C[5] ^ C[18]

NewCRC[15] = D[27] ^ D[14] ^ D[9] ^ C[1] ^ C[6] ^ C[19]

NewCRC[16] = D[28] ^ D[15] ^ D[10] ^ C[2] ^ C[7] ^ C[20]

NewCRC[17] = D[29] ^ D[16] ^ D[11] ^ C[3] ^ C[8] ^ C[21]

NewCRC[18] = D[30] ^ D[17] ^ D[12] ^ C[4] ^ C[9] ^ C[22]

NewCRC[19] = D[31] ^ D[18] ^ D[13] ^ C[5] ^ C[10] ^ C[23]

NewCRC[20] = D[19] ^ D[14] ^ C[6] ^ C[11]

NewCRC[21] = D[20] ^ D[15] ^ C[7] ^ C[12]

NewCRC[22] = D[21] ^ D[16] ^ C[8] ^ C[13]

NewCRC[23] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^

D[24] ^ D[23] ^ D[22] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^

C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[14] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^

C[22] ^ C[23]

ulCRC24_D32 = 0

// LFSR value from binary to hex.

bit_mask = 0x000001

for (f = 0f <= 23f++)

{

ulCRC24_D32 = ulCRC24_D32 + NewCRC[f] * bit_mask

bit_mask = bit_mask <<1

}

return(ulCRC24_D32 &0x00FFFFFF)

}

下面我们以CRC-16为例来说明任意长度数据流的CRC校验码生成过程。我们采用将数据流分成若干个8bit字符,并由低字节到高字绝塌节传送的并行方法来求CRC校验码。具体计算过程为:用一个16bit的寄存器来存放CRC校验值,且设定其初值为0x0000;将数据流的第一个8bit与16bit的CRC寄存器的高字节相异或,并将结果存入CRC寄存器高字节;CRC寄存器左移一位,最低1bit补零,同时检查移出的最高1bit,若移出的最高1bit为0,则继续按上述过程左移,若最高1bit为1,则将CRC寄存器中的值与生成多项式码相异或,结果存入CRC寄存器值;继续左移并重复上述处理方法,直到将8bit数据处理完为止,则此时CRC寄存器中的值就是第一个8bit数据对应的CRC校验码;然后将此时CRC寄存器的值作为初值,用同样的处理方法重复上述步骤来处理下一个8bit数据流,直到将所有的8bit字符都处理完后,此刻CRC寄存器中的值即为整个数据流对应的CRC校验码。

下面示出了其计算过程的流程图:

在用C语言编写CRC校验码的实现程序时我们应该注意,生成多项式 对应的十六进制数为0x18005,由于CRC寄存器左移过程中,移出的最高位为1时与 相异或,所以与16bit的CRC寄存器对应并塌圆的生成多项式的十六进制数可用0x8005表示。下面给出并行处理8bit数据流的C源程序:

unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)

//reg为crc寄存器, data_crc为将要处理的8bit数据流

{

unsigned short msb//crc寄存器将移出的最高1bit

unsigned short data

unsigned short gx = 0x8005, i = 0//i为左移次数, gx为生成多项式

data = (unsigned short)data_crc

data = data <<8

reg = reg ^ data

do

{

msb = reg &0x8000

reg = reg <<1

if(msb == 0x8000)

{

reg = reg ^ gx

}

i++

}

while(i <8)

return (reg)

}

以上为处理每一个8bit数据流的子程序,在计衫扮算整个数据流的CRC校验码时,我们只需将CRC_reg的初值置为0x0000,求第一个8bit的CRC值,之后,即可将上次求得的CRC值和本次将要处理的8bit数据作为函数实参传递给上述子程序的形参进行处理即可,最终返回的reg值便是我们所想得到的整个数据流的CRC校验值。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12444373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存