视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CRC16算法实现(C++MFC)
2025-10-05 23:15:43 责编:小OO
文档
//后加的函数,转换为十六进制的函数,以上结束

int String2Hex(CString str, CByteArray &senddata)

{

int hexdata,lowhexdata;

int hexdatalen=0;

int len=str.GetLength();

senddata.SetSize(len/2);

for(int i=0;i{

char lstr,hstr=str[i];

if(hstr==' ')

{

i++;

continue;

}

i++;

if(i>=len)

break;

lstr=str[i];

hexdata=ConvertHexChar(hstr);

lowhexdata=ConvertHexChar(lstr);

if((hexdata==16)||(lowhexdata==16))

break;

else

hexdata=hexdata*16+lowhexdata;

i++;

senddata[hexdatalen]=(char)hexdata;

hexdatalen++;

}

senddata.SetSize(hexdatalen);

return hexdatalen;

}

char ConvertHexChar(char ch)

{

if((ch>='0')&&(ch<='9'))

return ch-0x30;

else if((ch>='A')&&(ch<='F'))

return ch-'A'+10;

else if((ch>='a')&&(ch<='f'))

return ch-'a'+10;

else

return (-1);

}

//后加的函数,转换为十六进制的函数,到此结束

void CCRC16Dlg::OnButton1() //进行数据转换按键

{

// TODO: Add your control notification handler code here

UpdateData(TRUE); //读取编辑框内容

//m_Receive=m_send;//测试用

lenstr=String2Hex(m_send, senddata);//接收的字符转换成十六进制CByteArray类型

Arraylen=senddata.GetSize();//CByteArray类型数组长度

Receivedata.SetSize(Arraylen+2); //设置Receivedata数组的长度

for(int i=0;i{

Receivedata[i]=senddata[i];

}

//增加校验位*********

/**cc='0xFF';//测试用的

R1=0xF0FF;

char c[2];

c[0] = (R1 >> 8) & 0xff;

c[1] = R1 & 0xff;

Receivedata[Arraylen]=(R1 >> 8) & 0xff;

Receivedata[Arraylen+1]=R1 & 0xff;

**/

/*******生成CRC16 校验字节的步骤**************************

生成CRC16 校验字节的步骤如下:

1、 装入一个16 位寄存器,所有数位均为1;

2、 该16 位寄存器的低位字节与开始8 位字节数进行“异或”运算;

3、 把这个16 位寄存器向右移一位,高位补零;

4、 若向右移出的数位为1,则生成多项式1010000000000001(A001H)和这个寄存器进行“异或”运算,

若向右移出的数位为0 则返回;

5、 重复3 和4,直至移出8 位;

6、 其余8 位字节数依次重复2—5 之运算直至结束;

这个16 位寄存器即为2 字节的CRC 错误校验字节。

************************************************************/

R1=0xFFFF;//unsigned short int变量做16位的寄存器

for(int j=0;j{

R1=((senddata[j]&0x00FF)^(R1&0x00FF))|(R1&0xFF00);//“异或”运算

for(int K=0;K<8;K++)

{

if((R1&0x0001)==0x0001)//右移出的数位为1时,此处用到生成多项式1010000000000001(A001H)

R1=((R1>>1)&0x7FFF)^0xA001;//

else

R1=(R1>>1)&0x7FFF;

}

}

Receivedata[Arraylen+1]=(R1 >> 8) & 0xff;

Receivedata[Arraylen]=R1 & 0xff;

///*******************

datanum=Arraylen+2;//字符串长度

m_Receive="";//清空输出区域

CString strtemp;

for(int

k=0;k{

BYTE bt=(char)(Receivedata[k]); //字符型

strtemp.Format("%02X下载本文

显示全文
专题