SetBitStream

// wData 是数据  用ncData 为来表示wData
// int index = 0
// index = SetBitStream(index,1,4);        0001          index变成4
// index = SetBitStream(index,3,10)        0000000011    index变成14
// 0001   0000000011  将这两个数合起来  00010000000011   再以8位为一组表示  ==》 00010000  000011(不足8bit 后面补0) ==》 16 , 12

int CQR_Encode::SetBitStream(int nIndex, WORD wData, int ncData)    
{
    int i;

    if (nIndex == -1 || nIndex + ncData > MAX_DATACODEWORD * 8)     
        return -1;

    for (i = 0; i < ncData; ++i)
    {
        if (wData & (1 << (ncData - i - 1)))
        {
            m_byDataCodeWord[(nIndex + i) / 8] |= 1 << (7 - ((nIndex + i) % 8));
        }
    }

    return nIndex + ncData;
}
//模式指标,编码模式 //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"; 是这两个数值都能生成完整的二维码数据
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值