QRCode二维条码开发(代码)_2011.05.24

来源:互联网 发布:大数据时代的读后感 编辑:程序博客网 时间:2024/04/27 02:02


10:35:32

 

//函数功能:数字模式下将输入的数据转换成信息码

//参数说明:

//strInput                    -- 原始输入数据

//strVersionNum         -- 当前版本号

//strErrLevel           -- 当前纠错等级

//返回值:strDataCode   -- 返回编码后的码字

CString CQRCodeDlg::NumMode(CString strInput, CString strVersionNum, CString strErrLevel)

{

AfxMessageBox("进入到数字模式编码函数!");

int nLength = 0;//输入数据的长度

int nTemp = 0;//临时变量

int nVersionNum = 1;//版本号

int nBits = 0;//字符计数指示符的位数

int nBitsStream = 0;//位流的位数

int NN = 0,KK = 0;

CString strText;

CString strTemp;//临时存储变量

CString strDataCode;//输入数据按规则转换后的码字,也是此函数的返回值

char cInput[3];//对原始数据进行分组并存放入数组中

char buffer[20];

char chEncodeMode = '1';//代表数字编码模式

char* chErrLevel;//纠错等级

strVersionNum.Format("%d",nVersionNum);

chErrLevel = (LPSTR)(LPCSTR)strErrLevel;

//strErrLevel.Format("%s",chErrLevel)

strText = strInput;

strText = "01234567";

nLength = strText.GetLength();//得到输入数据的长度

//数字模式,将原始数据分为三个一组:

for(int i=0;i<nLength;i++)

{

if((i%3)==2)

{

if(strText[i] >= '0' && strText[i] <= '9')

cInput[2] = strText[i];

nTemp = atoi(cInput);//将字符转换成integer型数据

_itoa(nTemp,buffer,2);

strTemp.Format("%010s",buffer);//将int型数据转换成10位的二进制

strDataCode += strTemp;

}

if((i%3)==0)

{

if(strText[i] >= '0' && strText[i] <= '9')

cInput[0] = strText[i];

}

if((i%3)==1)

{

if(strText[i] >= '0' && strText[i] <= '9')

cInput[1] = strText[i];

}

}

//处理余位数字信息

if(nLength%3 == 1)//余数为1位,则将其转换成4位二进制

{

strTemp = strText.Right(1);//取出最右边的一位数字

nTemp = atoi(strTemp);

_itoa(nTemp,buffer,2);

strTemp.Format("%04s",buffer);

strDataCode += strTemp;

}

if(nLength%3 == 2)//余数为2位,则将其转换成7位二进制

{

strTemp = strText.Right(2);//取出最右边的2位数字

nTemp = atoi(strTemp);

_itoa(nTemp,buffer,2);

strTemp.Format("%07s",buffer);

strDataCode += strTemp;

}

_itoa(nLength,buffer,2);

nBits = IndicatorBits(chEncodeMode,nVersionNum);

switch(nBits)

{

case 10:

strTemp.Format("%010s",buffer);

break;

case 12:

strTemp.Format("%012s",buffer);

break;

case 14:

strTemp.Format("%014s",buffer);

break;

}

//此处可以根据编码模式和版本号判断字符长度是否超过了本版本的容量

strDataCode = "0001" + strTemp + strDataCode + "0000";//模式指示符+字符计数指示符+数据+结束符

int nCodeLength = strDataCode.GetLength();

if(nCodeLength%8 != 0)//不足8位时,末位补零

{

strTemp = strDataCode.Right(nCodeLength%8);

strDataCode = strDataCode.Left(nCodeLength - nCodeLength%8);

for(int i=0;i<(8-(nCodeLength%8));i++)//在字符串末尾补0

strTemp = strTemp + "0";

strDataCode += strTemp;

}

nCodeLength = strDataCode.GetLength();

NN = nTotalCodeWord[nVersionNum-1];//码字总数

KK = FindDataCodeWord(nVersionNum,*chErrLevel);//数据码字数

for(int j=0;j<((KK - nCodeLength/8)/2);j++)

strDataCode += "1110110000010001";

if(((KK - nCodeLength/8)%2) == 1)

strDataCode += "11101100";

int n = strDataCode.GetLength()/8;

nBitsStream = BitsStream(chEncodeMode,nBits,nLength);//得到编码后的位流数

if(nBitsStream == 151)

{

AfxMessageBox("此模式、此版本下已达到输入长度的上限!");

strDataCode = "0001" + strTemp + strDataCode + "0";

}

return strDataCode;

}