1. 程式人生 > >QRCode二維條碼開發(程式碼)_2011.05.24

QRCode二維條碼開發(程式碼)_2011.05.24

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;

}