异或校验算法的应用

异或交验算法

      通过本段程序将通过异或校验算法,对给定的字符串进行获取交验值,并根据一般的数据打包方法把数据加上包头、包尾、交验值和回车换行符,成为数据发送包。

 

  1. /*--------------------------------------------------------------------------------------
  2.  * 程序功能:将字符串按照NMEA-0183无线通信协议格式打包函数
  3.  * 执行条件:通过函数调用
  4.  * 执行结果:将给定的字符串参数经过异或校验后打包发送
  5.  *--------------------------------------------------------------------------------------*/
  6. void CSerialPortTestDlg::SendNMEAData(CString &strData)
  7. {
  8.     char checksum = 0, cr = 13, ln = 10;
  9.     char ch,cl;//校验位的高四位和第四位; 
  10.                //例如:校验值为5D,则ch='5';cl='D'; 
  11.     for (int i = 0;  i<strData.GetLength();  i++)
  12.     {
  13.         checksum = checksum ^ strData[i]; //进行异或交验取值 
  14.     }
  15.   /*--------------------------------------------------------------------------------------
  16.    * 功能:(下列代码)为了取得的异或值能够显示为字符
  17.    * 过程:先将异或后的一个字节,高四位和第四位分开,根据
  18.    * 对应的16进制数,显示出其字符。例如0000,对应16进制的0,
  19.    * 将会显示字符‘0’,即ASCII的第30个字符,1011对应16进制的B
  20.    * 将会显示字符‘B’,即ASCII 的第65个字符(‘A’后面那个,所
  21.    * 以计算方法是‘A’+1)
  22.    *--------------------------------------------------------------------------------------*/
  23.     ch = (checksum  >> 4) & 0x0F;  //取高位数;
  24.     cl = checksum & 0x0F;  //取低位数;
  25.     if (ch < 10));//低于10的数
  26.         ch = ch  +  '0';
  27.     else
  28.         ch = (ch - 10 ) +  'A';);//不低于10的16进制数,如:A、B、C、D、E、F
  29.     if (cl < 10)
  30.         cl = cl  +  '0';
  31.     else
  32.         cl = (cl - 10 )+  'A';
  33.     CString strNMEAData;
  34.     //加上包头、包尾、校验值和回车、换行符,形成数据包 
  35.     strNMEAData = '$' + strData + '*' + ch + cl + cr + ln;
  36.     m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);//将数据包发送 
  37.     m_strEditSendMessage.Format("发送数据包:%s",strNMEAData);//显示数据包
  38.     UpdateData(FALSE);
  39. }

异或交验算法

      通过本段程序将通过异或校验算法,对给定的字符串进行获取交验值,并根据一般的数据打包方法把数据加上包头、包尾、交验值和回车换行符,成为数据发送包。

 

  1. /*--------------------------------------------------------------------------------------
  2.  * 程序功能:将字符串按照NMEA-0183无线通信协议格式打包函数
  3.  * 执行条件:通过函数调用
  4.  * 执行结果:将给定的字符串参数经过异或校验后打包发送
  5.  *--------------------------------------------------------------------------------------*/
  6. void CSerialPortTestDlg::SendNMEAData(CString &strData)
  7. {
  8.     char checksum = 0, cr = 13, ln = 10;
  9.     char ch,cl;//校验位的高四位和第四位; 
  10.                //例如:校验值为5D,则ch='5';cl='D'; 
  11.     for (int i = 0;  i<strData.GetLength();  i++)
  12.     {
  13.         checksum = checksum ^ strData[i]; //进行异或交验取值 
  14.     }
  15.   /*--------------------------------------------------------------------------------------
  16.    * 功能:(下列代码)为了取得的异或值能够显示为字符
  17.    * 过程:先将异或后的一个字节,高四位和第四位分开,根据
  18.    * 对应的16进制数,显示出其字符。例如0000,对应16进制的0,
  19.    * 将会显示字符‘0’,即ASCII的第30个字符,1011对应16进制的B
  20.    * 将会显示字符‘B’,即ASCII 的第65个字符(‘A’后面那个,所
  21.    * 以计算方法是‘A’+1)
  22.    *--------------------------------------------------------------------------------------*/
  23.     ch = (checksum  >> 4) & 0x0F;  //取高位数;
  24.     cl = checksum & 0x0F;  //取低位数;
  25.     if (ch < 10));//低于10的数
  26.         ch = ch  +  '0';
  27.     else
  28.         ch = (ch - 10 ) +  'A';);//不低于10的16进制数,如:A、B、C、D、E、F
  29.     if (cl < 10)
  30.         cl = cl  +  '0';
  31.     else
  32.         cl = (cl - 10 )+  'A';
  33.     CString strNMEAData;
  34.     //加上包头、包尾、校验值和回车、换行符,形成数据包 
  35.     strNMEAData = '$' + strData + '*' + ch + cl + cr + ln;
  36.     m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);//将数据包发送 
  37.     m_strEditSendMessage.Format("发送数据包:%s",strNMEAData);//显示数据包
  38.     UpdateData(FALSE);
  39. }

猜你喜欢

转载自blog.csdn.net/dxpqxb/article/details/79169822
今日推荐