首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于数据校验的有关问题

2012-06-23 
关于数据校验的问题?龚建伟的书 visualc++_turboc串口通信编程实践 中有一个实例,其中有段代码如下:

关于数据校验的问题?
龚建伟的书 < <visual c++_turbo c串口通信编程实践> > 中有一个实例,其中有段代码如下:
使用的是NMEA-0183无线通信协议,原文是这样说的:
假设我们将串字符数组为:str中包括XXXXX,,①,②,③,④,......(注意不含$和*),设其长度为strlen,则可以通过以下程序段得到校验和
void CSerialPortTestDlg::SendNMEAData(CString &strData)
{
  char checksum=0,cr=13,ln=10;
  char c1,c2; //2个 半Bype 校验值 ,半Byte?
  for(int i=0;i<strData.GetLength();i++)
  checksum = checksum^strData[i]; //这一段看起来像是异或校验法,不知道对不对?
  c2=checksum & 0x0F;
  c1=((checksum >> 4) & 0x0F);

  if (c1 < 10) c1+= '0'; //将c1转化为ASCII字符,这是怎么实现的啊,没看明白?
  else c1 += 'A' - 10;

  if (c2 < 10) c2+= '0';
  else c2 += 'A' - 10; //这下面的都明白,就这段if语句不理解

  CString strNMEAData;
//加上包头,尾和校验值和回车换行符
  strNMEAData='$'+strData+"*"+c1+c2+cr+ln; 
//以下几行程序关不通用,在自己的程序中注意修改
  m_SerialPort.WriteToPort((LPCTSTR)strNMEAData);
  m_strEditSendMsg.Format("发送的数据包为:%s",strNMEAData);
  UpdateData(FALSE); //在发送显示编辑框中显示发送的数据包
}
首先一点就是,不明白他说中说那个什么半Byte校验,不知道校验和是怎么计算的,还是就是将c1,c2转化为ASCII的过程也不明白,各位帮忙解释以下啊!

[解决办法]
一个0到F的字符转成数字是:
int HexValue(unsigned char a)
{
a -= 48;
if(a > 9 ) a -= 7;
return a;
}//

热点排行