//模式指标,编码模式
//lpsSource 源数据
//ncLength 数据长度
//nVerGroup 版本组
//bool EncodeSourceData(char *lpsSource, int ncLength, int nVerGroup)
int EncodeSourceData(char *lpsSource, int ncLength, int nVerGroup)
{
int i, j;
int ncSrcBits, ncDstBits;
int nBlock = 0;
int ncComplete = 0;
unsigned short wBinCode;
memset(m_nBlockLength, 0, sizeof(m_nBlockLength));
for (m_ncDataBlock = i = 0; i < ncLength; ++i)
{
unsigned char byMode;
if (i < ncLength - 1 && IsKanjiData(lpsSource[i], lpsSource[i + 1]))
byMode = QR_MODE_KANJI; //日文
//else if(i < ncLength - 1 && IsChineseData(lpsSource[i], lpsSource[i + 1]))
//byMode = QR_MODE_CHINESE; //中文
else if (IsNumeralData(lpsSource[i]))
byMode = QR_MODE_NUMERAL; //数字
else if (IsAlphabetData(lpsSource[i]))
byMode = QR_MODE_ALPHABET; //字符
else
byMode = QR_MODE_8BIT; //字节
byMode = QR_MODE_8BIT; //字节
if (i == 0)
m_byBlockMode[0] = byMode; //
if (m_byBlockMode[m_ncDataBlock] != byMode)//如果前后两个数据的模式不一样
m_byBlockMode[++m_ncDataBlock] = byMode;
++m_nBlockLength[m_ncDataBlock];
if (byMode == QR_MODE_KANJI)//如果是日文模式,那么前后2个字节为一个汉字
{
++m_nBlockLength[m_ncDataBlock];
++i;
}
}
++m_ncDataBlock;
while (nBlock < m_ncDataBlock - 1)
{
int ncJoinFront, ncJoinBehind;
int nJoinPosition = 0;
if ((m_byBlockMode[nBlock] == QR_MODE_NUMERAL && m_byBlockMode[nBlock + 1] == QR_MODE_ALPHABET) ||
(m_byBlockMode[nBlock] == QR_MODE_ALPHABET && m_byBlockMode[nBlock + 1] == QR_MODE_NUMERAL))
{//如果前后2个数据块为字母和数字,可以合并成字母数字模式(字母模式包含了数字) 计算数据位流
ncSrcBits = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup) +
GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
ncDstBits = GetBitLength(QR_MODE_ALPHABET, m_nBlockLength[nBlock] + m_nBlockLength[nBlock + 1], nVerGroup);
if (ncSrcBits > ncDstBits)
{//如果合并前大于合并后长度
if (nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)
{//判断之前的数据块是不是8bit模式,如果是的话合并数据(必须要有3个数据块以上判断)
ncJoinFront = GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock - 1] + m_nBlockLength[nBlock], nVerGroup) +
GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
if (ncJoinFront > ncDstBits + GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock - 1], nVerGroup))
ncJoinFront = 0; //如果合并后的数据超过长度 非法
}
else
ncJoinFront = 0;//不满足合并的条件
if (nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
{//如果后面的数据块为8bit模式,合并数据(必须要有3个数据块以上判断)
ncJoinBehind = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup) +
GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock + 1] + m_nBlockLength[nBlock + 2], nVerGroup);
if (ncJoinBehind > ncDstBits + GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock + 2], nVerGroup))
ncJoinBehind = 0; //如果合并后的数据超过长度 非法
}
else
ncJoinBehind = 0;//不满足合并的条件
if (ncJoinFront != 0 && ncJoinBehind != 0)//前后的数据块合并后都不为0
{
nJoinPosition = (ncJoinFront < ncJoinBehind) ? -1 : 1;//位置的标记,如果前面的小于后面的为-1;大于等于为1
}
else
{//如果有一个或者都为0 如果前面不为0为-1;后面不为0为1 否则为0
nJoinPosition = (ncJoinFront != 0) ? -1 : ((ncJoinBehind != 0) ? 1 : 0);
}
if (nJoinPosition != 0)
{//如果合并后的数据不为0
if (nJoinPosition == -1)//前面有数据
{
m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
for (i = nBlock; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
}
else
{//后面有数据
m_byBlockMode[nBlock + 1] = QR_MODE_8BIT;//后面数据块为8BIT模式,将新的数据块模式定义成8BIT
m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];//长度
for (i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
}
--m_ncDataBlock;
}
else
{//合并后数据异常,或者不满足合并条件
if (nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_ALPHABET)
{//如果后面一块数据也是字母数字,合并数据
m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];
for (i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
}
//设置新数据块为字母数字
m_byBlockMode[nBlock] = QR_MODE_ALPHABET;
m_nBlockLength[nBlock] += m_nBlockLength[nBlock + 1];
for (i = nBlock + 1; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
//如果前面一块数据也是字母数字,合并数据
if (nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_ALPHABET)
{
m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
for (i = nBlock; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
}
}
continue;
}
}
++nBlock;
}
nBlock = 0;
while (nBlock < m_ncDataBlock - 1)
{//合并2个部分数据
ncSrcBits = GetBitLength(m_byBlockMode[nBlock], m_nBlockLength[nBlock], nVerGroup)
+ GetBitLength(m_byBlockMode[nBlock + 1], m_nBlockLength[nBlock + 1], nVerGroup);
ncDstBits = GetBitLength(QR_MODE_8BIT, m_nBlockLength[nBlock] + m_nBlockLength[nBlock + 1], nVerGroup);
if (nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)//前一数据块为BIT模式
ncDstBits -= (4 + nIndicatorLen8Bit[nVerGroup]);
if (nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
ncDstBits -= (4 + nIndicatorLen8Bit[nVerGroup]);
if (ncSrcBits > ncDstBits)
{//如果合并后数据增加,前一块数据是8bit数据
if (nBlock >= 1 && m_byBlockMode[nBlock - 1] == QR_MODE_8BIT)
{
m_nBlockLength[nBlock - 1] += m_nBlockLength[nBlock];
for (i = nBlock; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
--nBlock;
}
if (nBlock < m_ncDataBlock - 2 && m_byBlockMode[nBlock + 2] == QR_MODE_8BIT)
{//数据块+2也是8bit
m_nBlockLength[nBlock + 1] += m_nBlockLength[nBlock + 2];
for (i = nBlock + 2; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
}
//设置新的数据块为8BIT模式
m_byBlockMode[nBlock] = QR_MODE_8BIT;
m_nBlockLength[nBlock] += m_nBlockLength[nBlock + 1];
for (i = nBlock + 1; i < m_ncDataBlock - 1; ++i)
{
m_byBlockMode[i] = m_byBlockMode[i + 1];
m_nBlockLength[i] = m_nBlockLength[i + 1];
}
--m_ncDataBlock;
if (nBlock >= 1)
--nBlock;
continue;
}
++nBlock;
}
m_ncDataCodeWordBit = 0;
memset(m_byDataCodeWord, 0, MAX_DATACODEWORD);
for (i = 0; i < m_ncDataBlock && m_ncDataCodeWordBit != -1; ++i)
{
if (m_byBlockMode[i] == QR_MODE_NUMERAL)
{//如果数据块是数字模式
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 1, 4);
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (unsigned short)m_nBlockLength[i], nIndicatorLenNumeral[nVerGroup]);
for (j = 0; j < m_nBlockLength[i]; j += 3)
{
if (j < m_nBlockLength[i] - 2)
{
wBinCode = (unsigned short)(((lpsSource[ncComplete + j] - '0') * 100) +
((lpsSource[ncComplete + j + 1] - '0') * 10) +
(lpsSource[ncComplete + j + 2] - '0'));
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 10);
}
else if (j == m_nBlockLength[i] - 2)
{
wBinCode = (unsigned short)(((lpsSource[ncComplete + j] - '0') * 10) +
(lpsSource[ncComplete + j + 1] - '0'));
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 7);
}
else if (j == m_nBlockLength[i] - 1)
{
wBinCode = (unsigned short)(lpsSource[ncComplete + j] - '0');
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 4);
}
}
ncComplete += m_nBlockLength[i];
}
else if (m_byBlockMode[i] == QR_MODE_ALPHABET)
{
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 2, 4);
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (unsigned short)m_nBlockLength[i], nIndicatorLenAlphabet[nVerGroup]);
for (j = 0; j < m_nBlockLength[i]; j += 2)
{
if (j < m_nBlockLength[i] - 1)
{
wBinCode = (unsigned short)((AlphabetToBinaly(lpsSource[ncComplete + j]) * 45) +
AlphabetToBinaly(lpsSource[ncComplete + j + 1]));
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 11);
}
else
{
wBinCode = (unsigned short)AlphabetToBinaly(lpsSource[ncComplete + j]);
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 6);
}
}
ncComplete += m_nBlockLength[i];
}
else if (m_byBlockMode[i] == QR_MODE_8BIT)
{
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 4, 4);
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (unsigned short)m_nBlockLength[i], nIndicatorLen8Bit[nVerGroup]);
for (j = 0; j < m_nBlockLength[i]; ++j)
{
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (unsigned short)lpsSource[ncComplete + j], 8);
}
ncComplete += m_nBlockLength[i];
}
else// if(m_byBlockMode[i] == QR_MODE_KANJI)
{//日本模式
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 8, 4);
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (unsigned short)(m_nBlockLength[i] / 2), nIndicatorLenKanji[nVerGroup]);
for (j = 0; j < m_nBlockLength[i] / 2; ++j)
{
unsigned short wBinCode = KanjiToBinaly((unsigned short)(((unsigned char)lpsSource[ncComplete + (j * 2)] << 8) + (unsigned char)lpsSource[ncComplete + (j * 2) + 1]));
m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 13);
}
ncComplete += m_nBlockLength[i];
}
// else
// {//中文模式
// m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 8, 4);
// m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, (WORD)(m_nBlockLength[i] / 2), nIndicatorLenKanji[nVerGroup]);
// for (j = 0; j < m_nBlockLength[i] / 2; ++j)
// {
// WORD wBinCode = ChineseToBinaly((WORD)(((BYTE)lpsSource[ncComplete + (j * 2)] << 8) + (BYTE)lpsSource[ncComplete + (j * 2) + 1]));
// m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, wBinCode, 13);
// }
// ncComplete += m_nBlockLength[i];
// }
}
return (m_ncDataCodeWordBit != -1);
//return TRUE;
} 这个函数怎么修改,使char tbuf[512]="01011F36465C6A700FFC080401D8043333B33E3333733F66662E413333C442008079443333B33E3333733F66662E413333C44200807944329D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31A9D105E014402E02E3D160E011D5041011D42D31";
char tbuf[512]="socket:23111BF0034cACKACaC8IBZYC8GBZcACKACaC-IBZYC8GBZGBZCDnCDnCD2CDtCD1CD7CDzCEBCDdED6EDlED3EDrEDZEDZEDwEDYCKGEKGEKGEJkEIaEJVER8ER5ERzER4ESLESXER0ESCESGEI2EJmEK7EK7EJ-EJ8EKLEIqDzIHwDHwDOEpIEpRwBQACKACMEpMEpGEp8Csocket:23111BF0034cACKACaC8IBZYC8GBZcACKACaC-IBZYC8GBZGBZCDnCDnCD2CDtCD1CD7CDzCEBCDdED6EDlED3EDrEDZEDZEDwEDYCKGEKGEKGEJkEIaEJVER8ER5ERzER4ESLESXER0ESCESGEI2EJmEK7EK7EJ-EJ8EKLEIqDzIHwDHwDOEpIEpRwBQACKACMEpMEpGEp8Csocket:23111BF0034cACKACaC8IBZYC8GBZcACKACaC-IBZYC8GBZGBZCDnCDnCD2CDtCD1CD7CDzCEBCDdED6";
是这两个数值都能生成完整的二维码数据
最新发布