1. 程式人生 > >QRCode二維條碼開發(計算格式資訊)_2011.05.25

QRCode二維條碼開發(計算格式資訊)_2011.05.25

//函式功能:根據不同的糾錯等級,計算15位的格式資訊:BCH(15,5)
//引數說明:
//chErrLevel                     -- 糾錯等級
//返回值:strFormatInformation   -- 資料碼字
CString CQRCodeDlg::CalculateFormatInformation(CString chErrLevel)
{
 /*掩膜圖形暫選101,因為一個圖形一次只能選擇一種掩膜方式*/
 CString strFormatInformation;/*15位的格式資訊串*/
 CString strGeneratorInfo = "000010100110111";/*生成多項式資訊串*/
 CString strDataInfo;/*15位資料資訊*/
 char* cErrLevel;/*糾錯等級*/
 char buffer[15];
 int nFlag1 = 16;/*非0位置標記,隨便賦一個值*/
 int nFlag2 = 16;/*非0位置標記,隨便賦一個值*/
 int nGeneratorInfo = 0;
 int nDataInfo = 0;
 cErrLevel = (LPSTR)(LPCSTR)chErrLevel;/*cstring型別資料轉換為char型資料*/
 switch(*cErrLevel)
 {
 case 'L':
  strDataInfo = "011010000000000";/*資料資訊位賦值,佔據前5位*/
  break;
 case 'M':
  strDataInfo = "001010000000000";
  break;
 case 'Q':
  strDataInfo = "111010000000000";
  break;
 case 'H':
  strDataInfo = "101010000000000";
  break;
 }
 for(int i=0;i<15;i++)
 {
  if (strGeneratorInfo[i] == '1' && nFlag1 == 16)
   nFlag1 = i;/*除數,根據差值進行移位*/
  if (strDataInfo[i] == '1' && nFlag2 == 16)
   nFlag2 = i;/*被除數*/
 }
 /*nFlag1>nFlag2,則需進行移位,然後進行位運算操作,同者為0,不同為1*/
 nDataInfo = strtol(strDataInfo,NULL,2);
 nGeneratorInfo = strtol(strGeneratorInfo,NULL,2)<<(nFlag1 - nFlag2);/*通過移位做除法*/
 _itoa(nDataInfo^nGeneratorInfo,buffer,2);
 strFormatInformation.Format("%015s",buffer);
 strFormatInformation = strDataInfo.Left(5) + strFormatInformation.Right(10);
 _itoa(strtol(strFormatInformation,NULL,2)^strtol("101010000010010",NULL,2),buffer,2);
 strFormatInformation.Format("%015s",buffer);
 return strFormatInformation;
}