验证中...
10月20日,北京【人工智能】源创会火热报名中,点击报名收获 AI 训练指南
语言: C/C++
分类: 算法分析
最后更新于 2018-08-11 10:55
可以改成三个函数
原始数据 复制代码
//后加的函数,转换为十六进制的函数,以上结束
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<len;)
{
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<Arraylen;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<Arraylen;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<datanum;k++) //将数组转换为Cstring型变量
{
BYTE bt=(char)(Receivedata[k]); //字符型
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔*************************
//strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_Receive+=strtemp; //加入接收编辑框对应字符串
}
//***/
说明:此方法已经测试通过
CRC计算函数的封装
CString CControlUnitDemoDlg::CRC16(CString code)
{
CString resultCode = L"";
CByteArray data;
CByteArray tempdata;
int len = CString2Hex(code, data);
tempdata.SetSize(len + 2);
for (int i = 0; i < len;i++)
{
tempdata[i] = data[i];
}
unsigned short R1 = 0xFFFF;
for (int j = 0; j < len;j++)
{
R1 = ((data[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;
}
}
tempdata[len + 1] = (R1 >> 8) & 0xff;
tempdata[len] = R1 & 0xff;
CString cstr;
for (int k = 0; k < len + 2;k++)
{
BYTE bt = (char)(tempdata[k]);
cstr.Format(L"%02X", bt);
resultCode += cstr;
}
return resultCode;
}
例如:01060001002F——CRC——> 99D6

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助