QRCode二维条码开发(计算版本信息)

    技术2022-05-20  42

    //函数功能:根据不同的版本,计算18位的版本信息:BCH(18,6) //参数说明: //strVersionNum -- 版本号(只有版本7-40才有版本信息,其它版本没有版本信息) //返回值:strVersionInformation -- 数据码字 CString CQRCodeDlg::CalculateVersionInformation(CString strVersionNum) { CString strVersionInformation; CString strDataInfo;/*数据信息*/ CString strGeneratorInfo = "000001111100100101";/*生成多项式信息*/ CString strDataBuffer; int nVersionNum;/*版本号*/ int nFlag1; int nFlag2; int nGeneratorInfo = 0; int nDataBuffer = 0; char buffer[6]; nVersionNum = atoi(strVersionNum); if (nVersionNum >= 7) { _itoa(nVersionNum,buffer,2); strDataInfo.Format("s",buffer); strDataBuffer = strDataInfo + "000000000000"; do { for(int i=17;i>=0;i--) { if (strGeneratorInfo[i] == '1') nFlag1 = i;/*除数,根据差值进行移位*/ if (strDataBuffer[i] == '1') nFlag2 = i;/*被除数*/ } /*nFlag1>nFlag2,则需进行移位,然后进行位运算操作,同者为0,不同为1*/ if(nFlag1 >= nFlag2) { nDataBuffer = strtol(strDataBuffer,NULL,2);/*字符串二进制转换为十进制*/ nGeneratorInfo = strtol(strGeneratorInfo,NULL,2)<<(nFlag1 - nFlag2);/*通过移位做除法*/ _itoa(nDataBuffer^nGeneratorInfo,buffer,2); strDataBuffer.Format("8s",buffer); for(int i=17;i>=0;i--) { if (strGeneratorInfo[i] == '1') nFlag1 = i;/*除数,根据差值进行移位*/ if (strDataBuffer[i] == '1') nFlag2 = i;/*被除数*/ } } } while (nFlag1 >= nFlag2);/*注意:当二者相等时,进行最后一次计算*/ strVersionInformation = strDataInfo + strDataBuffer.Right(12); return strVersionInformation; } }

     

     

    经测试,此算法是正确的!34个版本的信息我都亲自生成过一遍,完全正确! 


    最新回复(0)