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
00101 00000
10100 000
11001____________
01101 000
11010 00
11001____________
00011 00
1100
1100即为模2除法的最终余数
所以最终CRC码为:0101 1001 0000 1100
如果算法有不对的地方,还望高手指点下。。。