关于CRC的简单总结

CRC码的生成步骤:

1.如果需要做16位的CRC校验,则需要将x的最高次幂为16生成多项式G(X)转换成对应的17位二进制数

G(X)=1+X(1)+X(3)+X(10)+X(13)+X(15)+X(16)

对应二进制码:1 1010 0100 0000 1011

2.将信息码左移16位

3.用生成多项式(二进制数)对信息码做除,得到16位的余数,模2除法 mod(x,y)= x - y * floor(x/y)

4.将余数拼到信息码左移后空出的位置,得到完整的CRC码

直接上代码:

////////////////////////////////////////////
/*
Author:闲云
Time:2012/04/06
转载或使用该代码,请注明出处,谢谢。。。
*/
////////////////////////////////////////////
void CCRC24Dlg::OnBtnCalCrc24() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	CString strTips;
	strTips=CRC24(m_strMD,m_strGD);
	MessageBox(strTips);
}

/*////////////////////////////////////////////////////////////////////////
功能:十六进制转为十进制
输入:char chData//需要转换的十六进制数,结合本需求,只考虑了一位的
输出:int iDataTemp//转换后的十进制数 
////////////////////////////////////////////////////////////////////////*/
int CCRC24Dlg::HexTODec(char chData)
{
	int iDataTemp=0;
	if('0'<=chData&&chData<='9'){
		iDataTemp=chData+iDataTemp*16-'0';
	}
	else if('a'<=chData&&chData<='z'){
		iDataTemp=chData+iDataTemp*16-'a'+10;
	}
	else if('A'<=chData&&chData<='Z'){
		iDataTemp=chData+iDataTemp*16-'A'+10;
	}
	return iDataTemp;
}

/*////////////////////////////////////////////////////////////////////////
功能:十进制转为二进制
输入:int iDecData//需要转换的十进制数
输出:CString strData//转换后的二进制字符串
////////////////////////////////////////////////////////////////////////*/
CString CCRC24Dlg::DecToBin(int iDecData)
{
	int i,iDataLen;
	CString strDataTemp,strData,strTemp;
	for(i=0;iDecData/2!=0;i++){
		strTemp.Format("%d",iDecData%2);
		strDataTemp+=strTemp;
		iDecData=iDecData/2;
	}
	strTemp.Format("%d",iDecData);
	strDataTemp+=strTemp;

	iDataLen=strDataTemp.GetLength();
	for (i=4;i>iDataLen;i--)
	{
		strData+="0";
	}
	for (i=0;i=lenGD);
	///////////补位成所需要的位数/////////////////////
	CString strCRC,strHex;
	for (j=strMD.GetLength();j
上面的函数已经完全可以实现我们的需求了,如果你比我还懒,不要紧,现在给你Demo的下载地址:

http://download.csdn.net/detail/nanfeiyannan/4204674

测试用例:

十六进制信息码:590--0101 1001 0000,生成项:11001

信息码左移4位补0:0101 1001 0000 0000

模2除法过程:

01011 00100000000

10110 0100000000

11001____________

01111 0100000000

11110 100000000

11001____________

00111 100000000

11110 0000000

11001____________

00111 0000000

11100 00000

11001____________

00101 00000

10100 000

11001____________

01101 000

11010 00

11001____________

00011 00

1100

1100即为模2除法的最终余数

所以最终CRC码为:0101 1001 0000 1100

如果算法有不对的地方,还望高手指点下。。。

你可能感兴趣的:(VC)