您的位置:首页 > 编程语言 > C语言/C++

C++ 对16进制字符串进行奇校验

2016-06-28 22:03 483 查看

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

/* 奇校验函数

/* inData: 输入数据,16进制字符串

/* return: 奇校验后的16进制字符串

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

CString ODDFun(CString indata)

{

 CString strRet = "", _indata = indata;

 int inLen = _indata.GetLength();

 if (inLen % 2 != 0)

 {

  return "";

 }

 while(_indata != "")

 {

  int sum = 0;

  CString str = "";

  int data = strtol(_indata.Left(2), NULL, 16);  //将16进制数转为10进制

  for (int i=1; i<8; ++i)  //除了校验位,判断1的个数

  {

   int tmp = 2<<(7-i);

   if ((data & (2<<(7-i))) == tmp)

   {

    sum = sum+1;

   }

  }

  

  if ((sum % 2) == 0) //1的个数为偶数

  {

   if ((data & 0x01) != 1)//校验位不为1

   {

    data = data + 1;

   }

  }

  else  //1的个数为奇数

  {

   if ((data & 0x01) == 1)//校验位为1

   {

    data = data -1;

   }

  }CString CTestODDDlg::ODDFun(CString indata)

{

CString strRet = "", _indata = indata;

int inLen = _indata.GetLength();

if (inLen % 2 != 0)

{

return "";

}

while(_indata != "")

{

int sum = 0;

CString str = "";

int data = strtol(_indata.Left(2), NULL, 16); //将16进制数转为10进制

for (int i=1; i<8; ++i) //除了校验位,判断1的个数

{

int tmp = 2<<(7-i);

if ((data & (2<<(7-i))) == tmp)

{

sum = sum+1;

}

}

if ((sum % 2) == 0) //1的个数为偶数

{

if ((data & 0x01) != 1)//校验位不为1

{

data = data + 1;

}

}

else //1的个数为奇数

{

if ((data & 0x01) == 1)//校验位为1

{

data = data -1;

}

}

str.Format("%02X", data);

strRet = strRet + str;

_indata = _indata.Mid(2);

}

return strRet;

}

  str.Format("%02X", data);

  strRet = strRet + str;

  _indata = _indata.Mid(2);

 }

 return strRet;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 奇校验