下面示出了其计算过程的流程图:
在用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校验值。
CRC校验是循伏纤环冗档缓余校缺蠢仿验,下面是C#的代码。protected byte[] GetCRC(byte[] b, int offset, int len)
{
byte CRC16Lo = 0
byte CRC16Hi = 0
byte bytC
byte bytTreat
byte bytBcrc
for (int i = 0i <leni++)
{
bytC = b[i + offset]
for (int flag = 0flag <= 7flag++)
{
bytTreat = (byte)(bytC &0x80)
bytC = (byte)((bytC * 2) % 0x100)
bytBcrc = (byte)(CRC16Hi &0x80)
CRC16Hi = (byte)(((CRC16Hi * 2) % 0x100) + CRC16Lo / 0x80)
CRC16Lo = (byte)((CRC16Lo * 2) % 0x100)
if (bytTreat != bytBcrc)
{
CRC16Hi = (byte)(CRC16Hi ^ 0x10)
CRC16Lo = (byte)(CRC16Lo ^ 0x21)
}
}
}
byte[] ReturnData = new byte[2]
ReturnData[0] = CRC16Hi
ReturnData[1] = CRC16Lo
return ReturnData
}
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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)