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;
}