您的位置:首页 > 其它

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

2011-06-01 10:27 169 查看
//函数功能:根据不同的版本,计算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("%06s",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("%018s",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个版本的信息我都亲自生成过一遍,完全正确!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐