1. 程式人生 > >建立QRCODE二維碼 c++原始碼

建立QRCODE二維碼 c++原始碼

本程式碼適合C++Builder,稍做改動可以用在其它C編譯器上

// QR_Encode.h : CQR_Encode 

// Date 2006/05/17    Ver. 1.22    Psytec Inc.

#if !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_) #define AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_

#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000

///////////////////////////////////////////////////////////////////////////// // 掕悢

// 更正水平  #define QR_LEVEL_L    0 #define QR_LEVEL_M    1 #define QR_LEVEL_Q    2 #define QR_LEVEL_H    3

// /資料模式  #define QR_MODE_NUMERAL        0 #define QR_MODE_ALPHABET    1 #define QR_MODE_8BIT        2 #define QR_MODE_KANJI        3

// 版本(模型)組  #define QR_VRESION_S    0 // 1~9  #define QR_VRESION_M    1 // 10 ~ 26 #define QR_VRESION_L    2 // 27 ~ 40

#define MAX_ALLCODEWORD     3706 // 最大的碼字總數  #define MAX_DATACODEWORD 2956 // 最大資料碼字(版本40 - L)的  #define MAX_CODEBLOCK      153 // 最大數量 Burokkudetakodowado(RS碼字等)  #define MAX_MODULESIZE      177 // 模組的最大數量的邊 

// 繪製點陣圖在邊際  #define QR_MARGIN    4

///////////////////////////////////////////////////////////////////////////// typedef struct tagRS_BLOCKINFO {     int ncRSBlock;        // 遙感塊      int ncAllCodeWord;    // 塊的碼字      int ncDataCodeWord;    // 數字資料碼字(字數的程式碼 - RS碼字數)

} RS_BLOCKINFO, *LPRS_BLOCKINFO;

///////////////////////////////////////////////////////////////////////////// //  QR碼版本(模型)的資訊 

typedef struct tagQR_VERSIONINFO {     int nVersionNo;       // 版本(型號)的數量(1-40)      int ncAllCodeWord; // 總人數的碼字 

    // 下面是一個數組索引錯誤矯正率 (0 = L, 1 = M, 2 = Q, 3 = H)      int ncDataCodeWord[4];    //資料碼字(碼字數量的總數 - RS碼字數) 

    int ncAlignPoint;    // 數字座標Araimentopatan      int nAlignPoint[6];    // 中心座標Araimentopatan 

    RS_BLOCKINFO RS_BlockInfo1[4]; // 遙感資訊塊(1)      RS_BLOCKINFO RS_BlockInfo2[4]; // 遙感塊資訊(2) 

} QR_VERSIONINFO, *LPQR_VERSIONINFO;

///////////////////////////////////////////////////////////////////////////// // CQR_Encode 僋儔僗

class CQR_Encode { // 峔抸/徚柵 public:     CQR_Encode();     ~CQR_Encode();

public:     int m_nLevel;        //錯誤更正水平      int m_nVersion;        // 版本(型號)      BOOL m_bAutoExtent;    // 版本(型號)標誌指定自動擴充套件      int m_nMaskingNo;    // /掩蔽模式的數量 

public:     int m_nSymbleSize;     BYTE m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE]; // [x][y]     // Bit5:功能模組(不包括由掩蔽)標誌     // Bit4:顯示資料的功能模組     // 04期Bit1:編碼資料     // Bit0:經過編碼掩模圖形資料     //通過邏輯和功能模組,11小時,並提請邏輯(布林和最終的判斷20小時) 

private:     int m_ncDataCodeWordBit; // 長度Detakodowadobitto      BYTE m_byDataCodeWord[MAX_DATACODEWORD]; // 輸入Detaenkodoeria

    int m_ncDataBlock;     BYTE m_byBlockMode[MAX_DATACODEWORD];     int m_nBlockLength[MAX_DATACODEWORD];

    int m_ncAllCodeWord; // 總人數的碼字(遙感資料,包括錯誤修正)      BYTE m_byAllCodeWord[MAX_ALLCODEWORD]; // / /計算總面積三字程式碼      BYTE m_byRSWork[MAX_CODEBLOCK]; // RS碼字計算工作 

// 功能相關的資料編碼  public:     BOOL EncodeData(int nLevel, int nVersion, BOOL bAutoExtent, int nMaskingNo, LPCSTR lpsSource, int ncSource = 0);

private:     int GetEncodeVersion(int nVersion, LPCSTR lpsSource, int ncLength);     BOOL EncodeSourceData(LPCSTR lpsSource, int ncLength, int nVerGroup);

    int GetBitLength(BYTE nMode, int ncData, int nVerGroup);

    int SetBitStream(int nIndex, WORD wData, int ncData);

    BOOL IsNumeralData(unsigned char c);     BOOL IsAlphabetData(unsigned char c);     BOOL IsKanjiData(unsigned char c1, unsigned char c2);

    BYTE AlphabetToBinaly(unsigned char c);     WORD KanjiToBinaly(WORD wc);

    void GetRSCodeWord(LPBYTE lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord);

// 功能模組相關的安置  private:     void FormatModule();

    void SetFunctionModule();     void SetFinderPattern(int x, int y);     void SetAlignmentPattern(int x, int y);     void SetVersionPattern();     void SetCodeWordPattern();     void SetMaskingPattern(int nPatternNo);     void SetFormatInfoPattern(int nPatternNo);     int CountPenalty(); };

/////////////////////////////////////////////////////////////////////////////

#endif // !defined(AFX_QR_ENCODE_H__AC886DF7_C0AE_4C9F_AC7A_FCDA8CB1DD37__INCLUDED_)

// QR_Encode.cpp : CQR_Encode 僋儔僗 僀儞僾儕儊儞僥乕僔儑儞 僼傽僀儖 // Date 2006/05/17    Ver. 1.22    Psytec Inc.

//#include "stdafx.h" #include <vcl.h> #include "QR_Encode.h"

#define min(a,b) (a)>(b)?(b):(a) ///////////////////////////////////////////////////////////////////////////// // QR版本資訊 static QR_VERSIONINFO QR_VersonInfo[] = {{0}, //                                          { 1, // Ver.1                                             26,   19,   16,   13,    9,//資料容量                                            0,   0,   0,   0,   0,   0,   0,                                            //糾錯塊數  碼字總數 資料碼字數                                            1,  26,  19,                                            1,  26,  16,                                            1,  26,  13,                                            1,  26,   9,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0},                                          { 2, // Ver.2                                             44,   34,   28,   22,   16,                                            1,  18,   0,   0,   0,   0,   0,                                            1,  44,  34,                                            1,  44,  28,                                            1,  44,  22,                                            1,  44,  16,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0},                                          { 3, // Ver.3                                             70,   55,   44,   34,   26,                                            1,  22,   0,   0,   0,   0,   0,                                            1,  70,  55,                                            1,  70,  44,                                            2,  35,  17,                                            2,  35,  13,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0},                                          { 4, // Ver.4                                            100,   80,   64,   48,   36,                                            1,  26,   0,   0,   0,   0,   0,                                            1, 100,  80,                                            2,  50,  32,                                            2,  50,  24,                                            4,  25,   9,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0},                                          { 5, // Ver.5                                            134,  108,   86,   62,   46,                                            1,  30,   0,   0,   0,   0,   0,                                            1, 134, 108,                                            2,  67,  43,                                            2,  33,  15,                                            2,  33,  11,                                            0,   0,   0,                                            0,   0,   0,                                            2,  34,  16,                                            2,  34,  12},                                          { 6, // Ver.6                                            172,  136,  108,   76,   60,                                            1,  34,   0,   0,   0,   0,   0,                                            2,  86,  68,                                            4,  43,  27,                                            4,  43,  19,                                            4,  43,  15,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0,                                            0,   0,   0},                                          { 7, // Ver.7                                            196,  156,  124,   88,   66,                                            2,  22,  38,   0,   0,   0,   0,                                            2,  98,  78,                                            4,  49,  31,                                            2,  32,  14,                                            4,  39,  13,                                            0,   0,   0,                                            0,   0,   0,                                            4,  33,  15,                                            1,  40,  14},                                          { 8, // Ver.8                                            242,  194,  154,  110,   86,                                            2,  24,  42,   0,   0,   0,   0,                                            2, 121,  97,                                            2,  60,  38,                                            4,  40,  18,                                            4,  40,  14,                                            0,   0,   0,                                            2,  61,  39,                                            2,  41,  19,                                            2,  41,  15},                                          { 9, // Ver.9                                            292,  232,  182,  132,  100,                                            2,  26,  46,   0,   0,   0,   0,                                            2, 146, 116,                                            3,  58,  36,                                            4,  36,  16,                                            4,  36,  12,                                            0,   0,   0,                                            2,  59,  37,                                            4,  37,  17,                                            4,  37,  13},                                          {10, // Ver.10                                            346,  274,  216,  154,  122,                                            2,  28,  50,   0,   0,   0,   0,                                            2,  86,  68,                                            4,  69,  43,                                            6,  43,  19,                                            6,  43,  15,                                            2,  87,  69,                                            1,  70,  44,                                            2,  44,  20,                                            2,  44,  16},                                          {11, // Ver.11                                            404,  324,  254,  180,  140,                                            2,  30,  54,   0,   0,   0,   0,                                            4, 101,  81,                                            1,  80,  50,                                            4,  50,  22,                                            3,  36,  12,                                            0,   0,   0,                                            4,  81,  51,                                            4,  51,  23,                                            8,  37,  13},                                          {12, // Ver.12                                            466,  370,  290,  206,  158,                                            2,  32,  58,   0,   0,   0,   0,                                            2, 116,  92,                                            6,  58,  36,                                            4,  46,  20,                                            7,  42,  14,                                            2, 117,  93,                                            2,  59,  37,                                            6,  47,  21,                                            4,  43,  15},                                          {13, // Ver.13                                            532,  428,  334,  244,  180,                                            2,  34,  62,   0,   0,   0,   0,                                            4, 133, 107,                                            8,  59,  37,                                            8,  44,  20,                                           12,  33,  11,                                            0,   0,   0,                                            1,  60,  38,                                            4,  45,  21,                                            4,  34,  12},                                          {14, // Ver.14                                            581,  461,  365,  261,  197,                                            3,  26,  46,  66,   0,   0,   0,                                            3, 145, 115,                                            4,  64,  40,                                           11,  36,  16,                                           11,  36,  12,                                            1, 146, 116,                                            5,  65,  41,                                            5,  37,  17,                                            5,  37,  13},                                          {15, // Ver.15                                            655,  523,  415,  295,  223,                                            3,  26,  48,  70,   0,   0,   0,                                            5, 109,  87,                                            5,  65,  41,                                            5,  54,  24,                                           11,  36,  12,                                            1, 110,  88,                                            5,  66,  42,                                            7,  55,  25,                                            7,  37,  13},                                          {16, // Ver.16                                            733,  589,  453,  325,  253,                                            3,  26,  50,  74,   0,   0,   0,                                            5, 122,  98,                                            7,  73,  45,                                           15,  43,  19,                                            3,  45,  15,                                            1, 123,  99,                                            3,  74,  46,                                            2,  44,  20,                                           13,  46,  16},                                          {17, // Ver.17                                            815,  647,  507,  367,  283,                                            3,  30,  54,  78,   0,   0,   0,                                            1, 135, 107,                                           10,  74,  46,                                            1,  50,  22,                                            2,  42,  14,                                            5, 136, 108,                                            1,  75,  47,                                           15,  51,  23,                                           17,  43,  15},                                          {18, // Ver.18                                            901,  721,  563,  397,  313,                                            3,  30,  56,  82,   0,   0,   0,                                            5, 150, 120,                                            9,  69,  43,                                           17,  50,  22,                                            2,  42,  14,                                            1, 151, 121,                                            4,  70,  44,                                            1,  51,  23,                                           19,  43,  15},                                          {19, // Ver.19                                            991,  795,  627,  445,  341,                                            3,  30,  58,  86,   0,   0,   0,                                            3, 141, 113,                                            3,  70,  44,                                           17,  47,  21,                                            9,  39,  13,                                            4, 142, 114,                                           11,  71,  45,                                            4,  48,  22,                                           16,  40,  14},                                          {20, // Ver.20                                           1085,  861,  669,  485,  385,                                            3,  34,  62,  90,   0,   0,   0,                                            3, 135, 107,                                            3,  67,  41,                                           15,  54,  24,                                           15,  43,  15,                                            5, 136, 108,                                           13,  68,  42,                                            5,  55,  25,                                           10,  44,  16},                                          {21, // Ver.21                                           1156,  932,  714,  512,  406,                                            4,  28,  50,  72,  94,   0,   0,                                            4, 144, 116,                                           17,  68,  42,                                           17,  50,  22,                                           19,  46,  16,                                            4, 145, 117,                                            0,   0,   0,                                            6,  51,  23,                                            6,  47,  17},                                          {22, // Ver.22                                           1258, 1006,  782,  568,  442,                                            4,  26,  50,  74,  98,   0,   0,                                            2, 139, 111,                                           17,  74,  46,                                            7,  54,  24,                                           34,  37,  13,                                            7, 140, 112,                                            0,   0,   0,                                           16,  55,  25,                                            0,   0,   0},                                          {23, // Ver.23                                           1364, 1094,  860,  614,  464,                                            4,  30,  54,  78, 102,   0,   0,                                            4, 151, 121,                                            4,  75,  47,                                           11,  54,  24,                                           16,  45,  15,                                            5, 152, 122,                                           14,  76,  48,                                           14,  55,  25,                                           14,  46,  16},                                          {24, // Ver.24                                           1474, 1174,  914,  664,  514,                                            4,  28,  54,  80, 106,   0,   0,                                            6, 147, 117,                                            6,  73,  45,                                           11,  54,  24,                                           30,  46,  16,                                            4, 148, 118,                                           14,  74,  46,                                           16,  55,  25,                                            2,  47,  17},                                          {25, // Ver.25                                           1588, 1276, 1000,  718,  538,                                            4,  32,  58,  84, 110,   0,   0,                                            8, 132, 106,                                            8,  75,  47,                                            7,  54,  24,                                           22,  45,  15,                                            4, 133, 107,                                           13,  76,  48,                                           22,  55,  25,                                           13,  46,  16},                                          {26, // Ver.26                                           1706, 1370, 1062,  754,  596,                                            4,  30,  58,  86, 114,   0,   0,                                           10, 142, 114,                                           19,  74,  46,                                           28,  50,  22,                                           33,  46,  16,                                            2, 143, 115,                                            4,  75,  47,                                            6,  51,  23,                                            4,  47,  17},                                          {27, // Ver.27                                           1828, 1468, 1128,  808,  628,                                            4,  34,  62,  90, 118,   0,   0,                                            8, 152, 122,                                           22,  73,  45,                                            8,  53,  23,                                           12,  45,  15,                                            4, 153, 123,                                            3,  74,  46,                                           26,  54,  24,                                           28,  46,  16},                                          {28, // Ver.28                                           1921, 1531, 1193,  871,  661,                                            5,  26,  50,  74,  98, 122,   0,                                            3, 147, 117,                                            3,  73,  45,                                            4,  54,  24,                                           11,  45,  15,                                           10, 148, 118,                                           23,  74,  46,                                           31,  55,  25,                                           31,  46,  16},                                          {29, // Ver.29                                           2051, 1631, 1267,  911,  701,                                            5,  30,  54,  78, 102, 126,   0,                                            7, 146, 116,                                           21,  73,  45,                                            1,  53,  23,                                           19,  45,  15,                                            7, 147, 117,                                            7,  74,  46,                                           37,  54,  24,                                           26,  46,  16},                                          {30, // Ver.30                                           2185, 1735, 1373,  985,  745,                                            5,  26,  52,  78, 104, 130,   0,                                            5, 145, 115,                                           19,  75,  47,                                           15,  54,  24,                                           23,  45,  15,                                           10, 146, 116,                                           10,  76,  48,                                           25,  55,  25,                                           25,  46,  16},                                          {31, // Ver.31                                           2323, 1843, 1455, 1033,  793,                                            5,  30,  56,  82, 108, 134,   0,                                           13, 145, 115,                                            2,  74,  46,                                           42,  54,  24,                                           23,  45,  15,                                            3, 146, 116,                                           29,  75,  47,                                            1,  55,  25,                                           28,  46,  16},                                          {32, // Ver.32                                           2465, 1955, 1541, 1115,  845,                                            5,  34,  60,  86, 112, 138,   0,                                           17, 145, 115,                                           10,  74,  46,                                           10,  54,  24,                                           19,  45,  15,                                            0,   0,   0,                                           23,  75,  47,                                           35,  55,  25,                                           35,  46,  16},                                          {33, // Ver.33                                           2611, 2071, 1631, 1171,  901,                                            5,  30,  58,  86, 114, 142,   0,                                           17, 145, 115,                                           14,  74,  46,                                           29,  54,  24,                                           11,  45,  15,                                            1, 146, 116,                                           21,  75,  47,                                           19,  55,  25,                                           46,  46,  16},                                          {34, // Ver.34                                           2761, 2191, 1725, 1231,  961,                                            5,  34,  62,  90, 118, 146,   0,                                           13, 145, 115,                                           14,  74,  46,                                           44,  54,  24,                                           59,  46,  16,                                            6, 146, 116,                                           23,  75,  47,                                            7,  55,  25,                                            1,  47,  17},                                          {35, // Ver.35                                           2876, 2306, 1812, 1286,  986,                                            6,  30,  54,  78, 102, 126, 150,                                           12, 151, 121,                                           12,  75,  47,                                           39,  54,  24,                                           22,  45,  15,                                            7, 152, 122,                                           26,  76,  48,                                           14,  55,  25,                                           41,  46,  16},                                          {36, // Ver.36                                           3034, 2434, 1914, 1354, 1054,                                            6,  24,  50,  76, 102, 128, 154,                                            6, 151, 121,                                            6,  75,  47,                                           46,  54,  24,                                            2,  45,  15,                                           14, 152, 122,                                           34,  76,  48,                                           10,  55,  25,                                           64,  46,  16},                                          {37, // Ver.37                                           3196, 2566, 1992, 1426, 1096,                                            6,  28,  54,  80, 106, 132, 158,                                           17, 152, 122,                                           29,  74,  46,                                           49,  54,  24,                                           24,  45,  15,                                            4, 153, 123,                                           14,  75,  47,                                           10,  55,  25,                                           46,  46,  16},                                          {38, // Ver.38                                           3362, 2702, 2102, 1502, 1142,                                            6,  32,  58,  84, 110, 136, 162,                                            4, 152, 122,                                           13,  74,  46,                                           48,  54,  24,                                           42,  45,  15,                                           18, 153, 123,                                           32,  75,  47,                                           14,  55,  25,                                           32,  46,  16},                                          {39, // Ver.39                                           3532, 2812, 2216, 1582, 1222,                                            6,  26,  54,  82, 110, 138, 166,                                           20, 147, 117,                                           40,  75,  47,                                           43,  54,  24,                                           10,  45,  15,                                            4, 148, 118,                                            7,  76,  48,                                           22,  55,  25,                                           67,  46,  16},                                          {40, // Ver.40                                           3706, 2956, 2334, 1666, 1276,                                            6,  30,  58,  86, 114, 142, 170,                                           19, 148, 118,                                           18,  75,  47,                                           34,  54,  24,                                           20,  45,  15,                                            6, 149, 119,                                           31,  76,  48,                                           34,  55,  25,                                           61,  46,  16}                                         };

///////////////////////////////////////////////////////////////////////////// // GF(2^8)指數→整數変換 static BYTE byExpToInt[] = {  1,   2,   4,   8,  16,  32,  64, 128,  29,  58, 116, 232, 205, 135,  19,  38,                              76, 152,  45,  90, 180, 117, 234, 201, 143,   3,   6,  12,  24,  48,  96, 192,                             157,  39,  78, 156,  37,  74, 148,  53, 106, 212, 181, 119, 238, 193, 159,  35,                              70, 140,   5,  10,  20,  40,  80, 160,  93, 186, 105, 210, 185, 111, 222, 161,                              95, 190,  97, 194, 153,  47,  94, 188, 101, 202, 137,  15,  30,  60, 120, 240,                             253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163,  91, 182, 113, 226,                             217, 175,  67, 134,  17,  34,  68, 136,  13,  26,  52, 104, 208, 189, 103, 206,                             129,  31,  62, 124, 248, 237, 199, 147,  59, 118, 236, 197, 151,  51, 102, 204,                             133,  23,  46,  92, 184, 109, 218, 169,  79, 158,  33,  66, 132,  21,  42,  84,                             168,  77, 154,  41,  82, 164,  85, 170,  73, 146,  57, 114, 228, 213, 183, 115,                             230, 209, 191,  99, 198, 145,  63, 126, 252, 229, 215, 179, 123, 246, 241, 255,                             227, 219, 171,  75, 150,  49,  98, 196, 149,  55, 110, 220, 165,  87, 174,  65,                             130,  25,  50, 100, 200, 141,   7,  14,  28,  56, 112, 224, 221, 167,  83, 166,                              81, 162,  89, 178, 121, 242, 249, 239, 195, 155,  43,  86, 172,  69, 138,   9,                              18,  36,  72, 144,  61, 122, 244, 245, 247, 243, 251, 235, 203, 139,  11,  22,                              44,  88, 176, 125, 250, 233, 207, 131,  27,  54, 108, 216, 173,  71, 142,   1};

///////////////////////////////////////////////////////////////////////////// // GF(2^8)整數→指數変換 static BYTE byIntToExp[] = {  0,   0,   1,  25,   2,  50,  26, 198,   3, 223,  51, 238,  27, 104, 199,  75,                               4, 100, 224,  14,  52, 141, 239, 129,  28, 193, 105, 248, 200,   8,  76, 113,                               5, 138, 101,  47, 225,  36,  15,  33,  53, 147, 142, 218, 240,  18, 130,  69,                              29, 181, 194, 125, 106,  39, 249, 185, 201, 154,   9, 120,  77, 228, 114, 166,                               6, 191, 139,  98, 102, 221,  48, 253, 226, 152,  37, 179,  16, 145,  34, 136,                              54, 208, 148, 206, 143, 150, 219, 189, 241, 210,  19,  92, 131,  56,  70,  64,                              30,  66, 182, 163, 195,  72, 126, 110, 107,  58,  40,  84, 250, 133, 186,  61,                             202,  94, 155, 159,  10,  21, 121,  43,  78, 212, 229, 172, 115, 243, 167,  87,                               7, 112, 192, 247, 140, 128,  99,  13, 103,  74, 222, 237,  49, 197, 254,  24,                             227, 165, 153, 119,  38, 184, 180, 124,  17,  68, 146, 217,  35,  32, 137,  46,                              55,  63, 209,  91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190,  97,                             242,  86, 211, 171,  20,  42,  93, 158, 132,  60,  57,  83,  71, 109,  65, 162,                              31,  45,  67, 216, 183, 123, 164, 118, 196,  23,  73, 236, 127,  12, 111, 246,                             108, 161,  59,  82,  41, 157,  85, 170, 251,  96, 134, 177, 187, 204,  62,  90,                             203,  89,  95, 176, 156, 169, 160,  81,  11, 245,  22, 235, 122, 117,  44, 215,                              79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168,  80,  88, 175};

///////////////////////////////////////////////////////////////////////////// // 糾錯碼生成多項式 static BYTE byRSExp7[]  = {87, 229, 146, 149, 238, 102,  21}; static BYTE byRSExp10[] = {251,  67,  46,  61, 118,  70,  64,  94,  32,  45}; static BYTE byRSExp13[] = { 74, 152, 176, 100,  86, 100, 106, 104, 130, 218, 206, 140,  78}; static BYTE byRSExp15[] = {  8, 183,  61,  91, 202,  37,  51,  58,  58, 237, 140, 124,   5,  99, 105}; static BYTE byRSExp16[] = {120, 104, 107, 109, 102, 161,  76,   3,  91, 191, 147, 169, 182, 194, 225, 120}; static BYTE byRSExp17[] = { 43, 139, 206,  78,  43, 239, 123, 206, 214, 147,  24,  99, 150,  39, 243, 163, 136}; static BYTE byRSExp18[] = {215, 234, 158,  94, 184,  97, 118, 170,  79, 187, 152, 148, 252, 179,   5,  98,  96, 153}; static BYTE byRSExp20[] = { 17,  60,  79,  50,  61, 163,  26, 187, 202, 180, 221, 225,  83, 239, 156, 164, 212, 212, 188, 190}; static BYTE byRSExp22[] = {210, 171, 247, 242,  93, 230,  14, 109, 221,  53, 200,  74,   8, 172,  98,  80, 219, 134, 160, 105,                            165, 231}; static BYTE byRSExp24[] = {229, 121, 135,  48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111,   0, 117, 232,                             87,  96, 227,  21}; static BYTE byRSExp26[] = {173, 125, 158,   2, 103, 182, 118,  17, 145, 201, 111,  28, 165,  53, 161,  21, 245, 142,  13, 102,                             48, 227, 153, 145, 218,  70}; static BYTE byRSExp28[] = {168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205,  27, 232, 201,  21,  43, 245,  87,                             42, 195, 212, 119, 242,  37,   9, 123}; static BYTE byRSExp30[] = { 41, 173, 145, 152, 216,  31, 179, 182,  50,  48, 110,  86, 239,  96, 222, 125,  42, 173, 226, 193,                            224, 130, 156,  37, 251, 216, 238,  40, 192, 180}; static BYTE byRSExp32[] = { 10,   6, 106, 190, 249, 167,   4,  67, 209, 138, 138,  32, 242, 123,  89,  27, 120, 185,  80, 156,                             38,  69, 171,  60,  28, 222,  80,  52, 254, 185, 220, 241}; static BYTE byRSExp34[] = {111,  77, 146,  94,  26,  21, 108,  19, 105,  94, 113, 193,  86, 140, 163, 125,  58, 158, 229, 239,                            218, 103,  56,  70, 114,  61, 183, 129, 167,  13,  98,  62, 129,  51}; static BYTE byRSExp36[] = {200, 183,  98,  16, 172,  31, 246, 234,  60, 152, 115,   0, 167, 152, 113, 248, 238, 107,  18,  63,                            218,  37,  87, 210, 105, 177, 120,  74, 121, 196, 117, 251, 113, 233,  30, 120}; static BYTE byRSExp38[] = {159,  34,  38, 228, 230,  59, 243,  95,  49, 218, 176, 164,  20,  65,  45, 111,  39,  81,  49, 118,                            113, 222, 193, 250, 242, 168, 217,  41, 164, 247, 177,  30, 238,  18, 120, 153,  60, 193}; static BYTE byRSExp40[] = { 59, 116,  79, 161, 252,  98, 128, 205, 128, 161, 247,  57, 163,  56, 235, 106,  53,  26, 187, 174,                            226, 104, 170,   7, 175,  35, 181, 114,  88,  41,  47, 163, 125, 134,  72,  20, 232,  53,  35,  15}; static BYTE byRSExp42[] = {250, 103, 221, 230,  25,  18, 137, 231,   0,   3,  58, 242, 221, 191, 110,  84, 230,   8, 188, 106,                             96, 147,  15, 131, 139,  34, 101, 223,  39, 101, 213, 199, 237, 254, 201, 123, 171, 162, 194, 117,                             50,  96}; static BYTE byRSExp44[] = {190,   7,  61, 121,  71, 246,  69,  55, 168, 188,  89, 243, 191,  25,  72, 123,   9, 145,  14, 247,                              1, 238,  44,  78, 143,  62, 224, 126, 118, 114,  68, 163,  52, 194, 217, 147, 204, 169,  37, 130,                            113, 102,  73, 181}; static BYTE byRSExp46[] = {112,  94,  88, 112, 253, 224, 202, 115, 187,  99,  89,   5,  54, 113, 129,  44,  58,  16, 135, 216,                            169, 211,  36,   1,   4,  96,  60, 241,  73, 104, 234,   8, 249, 245, 119, 174,  52,  25, 157, 224,                             43, 202, 223,  19,  82,  15}; static BYTE byRSExp48[] = {228,  25, 196, 130, 211, 146,  60,  24, 251,  90,  39, 102, 240,  61, 178,  63,  46, 123, 115,  18,                            221, 111, 135, 160, 182, 205, 107, 206,  95, 150, 120, 184,  91,  21, 247, 156, 140, 238, 191,  11,                             94, 227,  84,  50, 163,  39,  34, 108}; static BYTE byRSExp50[] = {232, 125, 157, 161, 164,   9, 118,  46, 209,  99, 203, 193,  35,   3, 209, 111, 195, 242, 203, 225,                             46,  13,  32, 160, 126, 209, 130, 160, 242, 215, 242,  75,  77,  42, 189,  32, 113,  65, 124,  69,                            228, 114, 235, 175, 124, 170, 215, 232, 133, 205}; static BYTE byRSExp52[] = {116,  50,  86, 186,  50, 220, 251,  89, 192,  46,  86, 127, 124,  19, 184, 233, 151, 215,  22,  14,                             59, 145,  37, 242, 203, 134, 254,  89, 190,  94,  59,  65, 124, 113, 100, 233, 235, 121,  22,  76,                             86,  97,  39, 242, 200, 220, 101,  33, 239, 254, 116,  51}; static BYTE byRSExp54[] = {183,  26, 201,  87, 210, 221, 113,  21,  46,  65,  45,  50, 238, 184, 249, 225, 102,  58, 209, 218,                            109, 165,  26,  95, 184, 192,  52, 245,  35, 254, 238, 175, 172,  79, 123,  25, 122,  43, 120, 108,                            215,  80, 128, 201, 235,   8, 153,  59, 101,  31, 198,  76,  31, 156}; static BYTE byRSExp56[] = {106, 120, 107, 157, 164, 216, 112, 116,   2,  91, 248, 163,  36, 201, 202, 229,   6, 144, 254, 155,                            135, 208, 170, 209,  12, 139, 127, 142, 182, 249, 177, 174, 190,  28,  10,  85, 239, 184, 101, 124,                            152, 206,  96,  23, 163,  61,  27, 196, 247, 151, 154, 202, 207,  20,  61,  10}; static BYTE byRSExp58[] = { 82, 116,  26, 247,  66,  27,  62, 107, 252, 182, 200, 185, 235,  55, 251, 242, 210, 144, 154, 237,                            176, 141, 192, 248, 152, 249, 206,  85, 253, 142,  65, 165, 125,  23,  24,  30, 122, 240, 214,   6,                            129, 218,  29, 145, 127, 134, 206, 245, 117,  29,  41,  63, 159, 142, 233, 125, 148, 123}; static BYTE byRSExp60[] = {107, 140,  26,  12,   9, 141, 243, 197, 226, 197, 219,  45, 211, 101, 219, 120,  28, 181, 127,   6,                            100, 247,   2, 205, 198,  57, 115, 219, 101, 109, 160,  82,  37,  38, 238,  49, 160, 209, 121,  86,                             11, 124,  30, 181,  84,  25, 194,  87,  65, 102, 190, 220,  70,  27, 209,  16,  89,   7,  33, 240}; static BYTE byRSExp62[] = { 65, 202, 113,  98,  71, 223, 248, 118, 214,  94,   0, 122,  37,  23,   2, 228,  58, 121,   7, 105,                            135,  78, 243, 118,  70,  76, 223,  89,  72,  50,  70, 111, 194,  17, 212, 126, 181,  35, 221, 117,                            235,  11, 229, 149, 147, 123, 213,  40, 115,   6, 200, 100,  26, 246, 182, 218, 127, 215,  36, 186,                            110, 106}; static BYTE byRSExp64[] = { 45,  51, 175,   9,   7, 158, 159,  49,  68, 119,  92, 123, 177, 204, 187, 254, 200,  78, 141, 149,                            119,  26, 127,  53, 160,  93, 199, 212,  29,  24, 145, 156, 208, 150, 218, 209,   4, 216,  91,  47,                            184, 146,  47, 140, 195, 195, 125, 242, 238,  63,  99, 108, 140, 230, 242,  31, 204,  11, 178, 243,                            217, 156, 213, 231}; static BYTE byRSExp66[] = {  5, 118, 222, 180, 136, 136, 162,  51,  46, 117,  13, 215,  81,  17, 139, 247, 197, 171,  95, 173,                             65, 137, 178,  68, 111,  95, 101,  41,  72, 214, 169, 197,  95,   7,  44, 154,  77, 111, 236,  40,                            121, 143,  63,  87,  80, 253, 240, 126, 217,  77,  34, 232, 106,  50, 168,  82,  76, 146,  67, 106,                            171,  25, 132,  93,  45, 105}; static BYTE byRSExp68[] = {247, 159, 223,  33, 224,  93,  77,  70,  90, 160,  32, 254,  43, 150,  84, 101, 190, 205, 133,  52,                             60, 202, 165, 220, 203, 151,  93,  84,  15,  84, 253, 173, 160,  89, 227,  52, 199,  97,  95, 231,                             52, 177,  41, 125, 137, 241, 166, 225, 118,   2,  54,  32,  82, 215, 175, 198,  43, 238, 235,  27,                            101, 184, 127,   3,   5,   8, 163, 238};

static LPBYTE  byRSExp[] = {NULL,      NULL,      NULL,      NULL,      NULL,      NULL,      NULL,      byRSExp7,  NULL,      NULL,                             byRSExp10, NULL,      NULL,      byRSExp13, NULL,      byRSExp15, byRSExp16, byRSExp17, byRSExp18, NULL,                             byRSExp20, NULL,      byRSExp22, NULL,      byRSExp24, NULL,      byRSExp26, NULL,      byRSExp28, NULL,                             byRSExp30, NULL,      byRSExp32, NULL,      byRSExp34, NULL,      byRSExp36, NULL,      byRSExp38, NULL,                             byRSExp40, NULL,      byRSExp42, NULL,      byRSExp44, NULL,      byRSExp46, NULL,      byRSExp48, NULL,                             byRSExp50, NULL,      byRSExp52, NULL,      byRSExp54, NULL,      byRSExp56, NULL,      byRSExp58, NULL,                             byRSExp60, NULL,      byRSExp62, NULL,      byRSExp64, NULL,      byRSExp66, NULL,      byRSExp68};

// 字元計數指示符位數, {S, M, L}) static int nIndicatorLenNumeral[]  = {10, 12, 14}; static int nIndicatorLenAlphabet[] = { 9, 11, 13}; static int nIndicatorLen8Bit[]       = { 8, 16, 16}; static int nIndicatorLenKanji[]       = { 8, 10, 12};

///////////////////////////////////////////////////////////////////////////// // QR_Encode 僋儔僗偺峔抸/徚柵

CQR_Encode::CQR_Encode() { }

CQR_Encode::~CQR_Encode() { }

///////////////////////////////////////////////////////////////////////////// // CQR_Encode::EncodeData //應用::資料編碼 //引數:水平誤差修正模型(0 =自動),自動延長旗模式,掩蔽人數(-1 =自動),編碼資料,長度編碼資料 //返回:成功編碼= TRUE時,沒有資料,經過一段時間或空間=假 BOOL CQR_Encode::EncodeData(int nLevel, int nVersion, BOOL bAutoExtent, int nMaskingNo, LPCSTR lpsSource, int ncSource) {     int i, j;

    m_nLevel = nLevel;     m_nMaskingNo = nMaskingNo;

    // 如果沒有長度由資料採集指定lstrlen     int ncLength = ncSource > 0 ? ncSource : lstrlen(lpsSource);

    if (ncLength == 0)         return FALSE; // 無資料

    //版本(型號)檢視     int nEncodeVersion = GetEncodeVersion(nVersion, lpsSource, ncLength);

    if (nEncodeVersion == 0)         return FALSE; // 梕検僆乕僶乕

    if (nVersion == 0)     {         // 宆斣帺摦         m_nVersion = nEncodeVersion;     }     else     {         if (nEncodeVersion <= nVersion)         {             m_nVersion = nVersion;         }         else         {             if (bAutoExtent)                 m_nVersion = nEncodeVersion; // 版本(型號)自動延長             else                 return FALSE; // 梕検僆乕僶乕         }     }

    // Taminetakodo“0000” 補充說:     int ncDataCodeWord = QR_VersonInfo[m_nVersion].ncDataCodeWord[nLevel];

    int ncTerminater = min(4, (ncDataCodeWord * 8) - m_ncDataCodeWordBit);

    if (ncTerminater > 0)         m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 0, ncTerminater);

    // Padingukodo“11101100,00010001,” 補充說     BYTE byPaddingCode = 0xec;

    for (i = (m_ncDataCodeWordBit + 7) / 8; i < ncDataCodeWord; ++i)     {         m_byDataCodeWord[i] = byPaddingCode;

        byPaddingCode = (BYTE)(byPaddingCode == 0xec ? 0x11 : 0xec);     }

    // 計算總面積清除碼字     m_ncAllCodeWord = QR_VersonInfo[m_nVersion].ncAllCodeWord;     ZeroMemory(m_byAllCodeWord, m_ncAllCodeWord);

    int nDataCwIndex = 0; // 文書處理資料的程式碼的位置

    //司的資料塊     int ncBlock1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[nLevel].ncRSBlock;     int ncBlock2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[nLevel].ncRSBlock;     int ncBlockSum = ncBlock1 + ncBlock2;

    int nBlockNo = 0; // 處理塊數

    // 另一個數據碼字塊     int ncDataCw1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[nLevel].ncDataCodeWord;     int ncDataCw2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[nLevel].ncDataCodeWord;

    // Detakodowadointaribu配置     for (i = 0; i < ncBlock1; ++i)     {         for (j = 0; j < ncDataCw1; ++j)         {             m_byAllCodeWord[(ncBlockSum * j) + nBlockNo] = m_byDataCodeWord[nDataCwIndex++];         }

        ++nBlockNo;     }

    for (i = 0; i < ncBlock2; ++i)     {         for (j = 0; j < ncDataCw2; ++j)         {             if (j < ncDataCw1)             {