用STC8A单片机在TFT屏上显示二维码

   最近项目需要用单片机在TFT屏上显示二维码,将C++下显示二维码的代码经过改造,移值到C代码的单片机,成功运行,经多次测试能稳定运行,TFT屏显示部分,共占用单片机资源:变量内存:2376字节(约2.3K),代码空间:21595字节(约21K),能显示如果用STC8A系列单片机,如STC8A8K64S4A12,内存8K,代码空间64K,资源还是很充足的。在TFT屏上显示二维码,其实和电脑上显示BMP图类似,将需要显示的字节串和字符长度输入 到二维码生成函数中,得到m_nVersion值,通过这个值得到 m_nSymbleSize = m_nVersion * 4 + 17 ;m_nSymbleSize 就是显示的宽度和高度值(二维码显示的高度和宽度一样)。 根据m_nSymbleSize值和TFT屏的分辨性宽和高,确定填充的点值的倍数,选择合适的填充倍数,以免二维码显示太小或太大。虽然没有太多技术难度,但也费了我一些时间,把它放出来给有需要的人分享,少走弯路,节省点时间。

二维码主要显示函数:

void QRDISPLAYTOTFT(u8 qrcode_data,int nQRLen),参数是需要显示的字符串以及字符串长度。本人使用的是1.8“TFT屏,屏的分辨率为160128。
void QRDISPLAYTOTFT(u8 *qrcode_data,int nQRLen)
{
u8 xdata i,j,nScale,px,py;
if(EncodeData(qrcode_data,nQRLen)==FALSE)
{
return;
}
m_nSymbleSize = m_nVersion * 4 + 17 ;

//TFT size=128*160
if(((m_nSymbleSize*2)+4)>128)//最小点是2x2个像素点,像素点最大不能超过128点
{			return;
}
//m_nSymbleSize = m_nVersion * 4 + 17 ;
//m_nVersion=1,m_nSymbleSize=21 21*5=105 
//m_nVersion=2,m_nSymbleSize=25 25*4=100
//m_nVersion=3,m_nSymbleSize=29 29*3=87 
//m_nVersion=4,m_nSymbleSize=33 33*3=99 
//m_nVersion=5,m_nSymbleSize=37 37*3=11	
//通过m_nVersion,得到二维码显示的x,y起始坐标,以及放大倍数
//nScale 是放大倍数,显示一个像素点,可以只填充一个点,
//但由于显示太小,nScale=5,表示用5*5=25个点组成的正方形,来显示一个点
if(m_nVersion==1)
{nScale=5;px=27;py=12;
}
else if(m_nVersion==2)
{nScale=4;px=30;py=15;
}
else if(m_nVersion==3)
{nScale=3;px=36;py=20;
}
else if(m_nVersion==4)
{nScale=3;px=30;py=16;
}
else if(m_nVersion==5)
{nScale=3;px=25;py=10;		
}
else
{return;
}
//以白色清除屏上显示数据
LCD_Clear(WHITE);	
//根据EncodeData()得到的m_byModuleData[][]显示点阵数组,进行TFT屏在屏上填充数据,显示出二维码
for(i=0;i<m_nSymbleSize;i++)
{for(j=0;j<m_nSymbleSize;j++){if(m_byModuleData[i][j]==1){DrawDot_TFT(px,py,i,j,nScale);}}
}

}
//TFT屏打点填充函数
void DrawDot_TFT(uchar x0,uchar y0,uchar New_x,uchar New_y,uchar nScale)
{
u8 pos,t;
u16 x,y;
x = x0+New_xnScale;
y = y0+New_y
nScale;

//当前x,y起始坐标,如果大于屏的最大分辨率,则异常返回

if(x>LCD_W||y>LCD_H)
return;

Address_set(x,y,x+nScale-1,y+nScale-1); //设置光标位置 for(pos=0;pos<nScale;pos++)
{ for(t=0;t<nScale;t++){          //nQRDisplayFColor是画笔颜色,常用的为蓝牙,桃红,绿色等,// LCD_WR_DATA函数就是在当前光标处用当前画笔颜色画个点。//不同厂家的屏,可能是不同函数,但功能 一样。LCD_WR_DATA(nQRDisplayFColor);	}
}		

}

二维码的C++类移值:

    二维码的QR_Encode.h和QR_Encode.cpp,C++的二维码生成函数在网上有很多,也很容易找到,稍微修改一下,就成了单片机版本上可用的C代码,针对单片机内存容量小的特点,把二维码类中的数组,都变成code类型,并且根据实际字符串长度显示需求,确定最大的m_nVersion值,这样将涉及大内存和占用空间大的数组进行固定。比如你定义m_nVersion=5.则QR_VERSIONINFO QR_VersonInfo[]数组,大于5的多余数值,直接清掉。还有一个显示变量数组,m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE], m_nVersion如果等于5,通过m_nVersion的值得到MAX_MODULESIZE,这样来确定数组值的大小。因为MAX_MODULESIZE=m_nSymbleSize = m_nVersion * 4 + 17 ;	m_nVersion =5,则MAX_MODULESIZE=5*4+17=37,则直接定义MAX_MODULESIZE=37。

还有下面几个值的大小,我是用C++软件测试出来,当m_nVersion最大值为5时,他们的最小值。小于这个值,会出异常。
#define MAX_ALLCODEWORD 172
#define MAX_DATACODEWORD 108
#define MAX_CODEBLOCK 65

    还有就是修改一些常用函数,比如C++中的变量清0函数,ZeroMemory(变量,长度),修改为memset(变量,0,长度)等。最后注意一下,EncodeData()函数中的变量值,nLevel=1,nVersion=0,bAutoExtent=1,nMaskingNo=-1,如果填其它值,也能出现二维码,但多次使用,显示二维码会不一样,有点奇怪,我没有时间去找问题,直接用C++版本中默认的上面数据,就没有问题。具体看QR_Encode.h和QR_Encode.C代码。

QR_Encode.h

#ifndef __QRENCODE_H
#define __QRENCODE_H
#include “types.h”

#ifdef TFTDISPLAYQRCODE

//typedef enum {FALSE = 0, TRUE = !FALSE} bool;
#define min(a,b) (((a) < (b)) ? (a) : (b))
//4种纠错等级,可恢复的码字比例为:
#define QR_LEVEL_L 0 //7%的字码可被修正
#define QR_LEVEL_M 1 //15%的字码可被修正
#define QR_LEVEL_Q 2 //25%的字码可被修正
#define QR_LEVEL_H 3 //30%的字码可被修正

//编码形式
#define QR_MODE_NUMERAL 0
#define QR_MODE_ALPHABET 1
#define QR_MODE_8BIT 2
#define QR_MODE_KANJI 3
#define QR_MODE_CHINESE 4

//Number of bits per length field
//Encoding Ver.1–9 10–26 27–40
//Numeric 10 12 14
//Alphanumeric 9 11 13
//Byte 8 16 16
//Kanji 8 10 12
//Chinese
//P17 字符计数指示的位数
#define QR_VRESION_S 0
#define QR_VRESION_M 1
#define QR_VRESION_L 2

#define QR_MARGIN 4
#define QR_VER1_SIZE 21// 版本的行列数

#define MAX_ALLCODEWORD 172
#define MAX_DATACODEWORD 108
#define MAX_CODEBLOCK 65
#define MAX_MODULESIZE 37
// 25:Version=2,最大字符=32(16个汉字)
// 29:Version=3,最大字符=49(24.5个汉字)
// 33:Version=4,最大字符=78(39个汉字)
// 37:Version=5,最大字符=106(53个汉字)
// 41:Version=6,最大字符=134(67个汉字)
// 45:Version=7,最大字符=154(77个汉字)
// 49:Version=8,最大字符=192(96个汉字)
// 53:
//#define MAX_MODULESIZE 177//P14 每边的模块数(A) (VER:40 ) Ver:40 = 21+(Ver-1)*4
extern int xdata m_nVersion;
extern int xdata m_nSymbleSize;
extern BYTE xdata m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE];
//m_nSymbleSize = m_nVersion * 4 + 17;
/////////////////////////////////////////////////////////////////////////////
typedef struct
{
u16 ncRSBlock; //纠错的块数
u16 ncAllCodeWord; //码字总数
u16 ncDataCodeWord; //指定纠错等级下的数据码字数
}RS_BLOCKINFO;
typedef struct
{
u16 nVersionNo; //ver 1~40
u16 ncAllCodeWord; //码字总数=数据码字+纠错码字

u16 ncDataCodeWord[4];	//指定纠错等级下的数据码字(0=L,1=M,2=Q,3=H)
u16 ncAlignPoint;		//P61 表E1 校正图形 个数
u16 nAlignPoint[6];		//P61 表E1 校正图形	行列坐标
//(0=L,1=M,2=Q,3=H)
RS_BLOCKINFO RS_BlockInfo1[4];	//纠错块1
RS_BLOCKINFO RS_BlockInfo2[4];	//纠错块2

}QR_VERSIONINFO;

bool EncodeData(char *lpsSource,int ncSource);

int GetEncodeVersion(int nVersion, char *lpsSource, int ncLength);
//bool EncodeSourceData(char *lpsSource, int ncLength, int nVerGroup);
int EncodeSourceData(char *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(BYTE *lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord);

void FormatModule(void);

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

#endif
#endif

QR_Encode.C

#include “string.h”
#include “stc8.h”
#include “main.h”

#ifdef TFTDISPLAYQRCODE

#include “QR_Encode.h”

const QR_VERSIONINFO code QR_VersonInfo[] = {{0}, // (僟儈乕:Ver.0)
{ 1, //m_nVersion=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, // m_nVersion=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, // m_nVersion=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, // m_nVersion=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, // m_nVersion=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}

};
const unsigned char code 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};

const unsigned char code 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};

/////////////////////////////////////////////////////////////////////////////
const unsigned char code byRSExp7[] = {87, 229, 146, 149, 238, 102, 21};
const unsigned char code byRSExp10[] = {251, 67, 46, 61, 118, 70, 64, 94, 32, 45};
const unsigned char code byRSExp13[] = { 74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78};
const unsigned char code byRSExp15[] = { 8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105};
const unsigned char code byRSExp16[] = {120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120};
const unsigned char code byRSExp17[] = { 43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136};
const unsigned char code byRSExp18[] = {215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153};
const unsigned char code byRSExp20[] = { 17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190};
const unsigned char code byRSExp22[] = {210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105,
165, 231};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};
const unsigned char code 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};

const unsigned char code *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};

const unsigned char code nIndicatorLenNumeral[] = {10, 12, 14};
const unsigned char code nIndicatorLenAlphabet[] = { 9, 11, 13};
const unsigned char code nIndicatorLen8Bit[] = { 8, 16, 16};
const unsigned char code nIndicatorLenKanji[] = { 8, 10, 12};

int xdata m_nSymbleSize;
unsigned char xdata m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE];
unsigned char xdata QRTmpBuffer[20];

int xdata m_ncDataCodeWordBit;
unsigned char xdata m_byDataCodeWord[MAX_DATACODEWORD];

int m_ncDataBlock;
unsigned char xdata m_byBlockMode[MAX_DATACODEWORD];
unsigned char xdata m_nBlockLength[MAX_DATACODEWORD];

int m_ncAllCodeWord;
unsigned char xdata m_byAllCodeWord[MAX_ALLCODEWORD];
unsigned char xdata m_byRSWork[MAX_CODEBLOCK];

int xdata m_nLevel;
int xdata m_nVersion;
bool xdata m_bAutoExtent;
int xdata m_nMaskingNo;

//lpsSource 源数据 ncSource字符串长度
bool EncodeData(char *lpsSource,int ncSource)
{
int xdata ncLength, nEncodeVersion, ncDataCodeWord, ncTerminater;
int xdata ncDataCw1, ncDataCw2,ncBlock1, ncBlock2, ncBlockSum;
int xdata i, j,ncRSCw1, ncRSCw2;
int xdata nDataCwIndex = 0,nBlockNo = 0;
int xdata nVersion=0, bAutoExtent=1;
unsigned char xdata byPaddingCode = 0xec;

//ncSource = 0;
int nLevel=1;m_nLevel = nLevel;
m_nMaskingNo = -1;
nVersion = 0;//1// 僨乕僞挿偑巜掕偝傟偰偄側偄応崌偼 lstrlen 偵傛偭偰庢摼
ncLength = ncSource;if (ncLength == 0)return FALSE; // 僨乕僞側偟// 僶乕僕儑儞(宆斣)僠僃僢僋
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; // 僶乕僕儑儞(宆斣)帺摦奼挘elsereturn FALSE; // 梕検僆乕僶乕}
}// 僞乕儈僱乕僞僐乕僪"0000"晅壛
ncDataCodeWord = QR_VersonInfo[m_nVersion].ncDataCodeWord[nLevel];ncTerminater = min(4, (ncDataCodeWord * 8) - m_ncDataCodeWordBit);if (ncTerminater > 0)m_ncDataCodeWordBit = SetBitStream(m_ncDataCodeWordBit, 0, ncTerminater);// 僷僨傿儞僌僐乕僪"11101100, 00010001"晅壛
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;
memset(m_byAllCodeWord, 0,MAX_ALLCODEWORD);nDataCwIndex = 0; // 僨乕僞僐乕僪儚乕僪張棟埵抲// 僨乕僞僽儘僢僋暘妱悢
ncBlock1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[nLevel].ncRSBlock;
ncBlock2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[nLevel].ncRSBlock;

ncBlockSum = ncBlock1 + ncBlock2;

nBlockNo = 0; // 張棟拞僽儘僢僋斣崋// 僽儘僢僋暿僨乕僞僐乕僪儚乕僪悢
ncDataCw1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[nLevel].ncDataCodeWord;
ncDataCw2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[nLevel].ncDataCodeWord;// 僨乕僞僐乕僪儚乕僪僀儞僞乕儕乕僽攝抲
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){m_byAllCodeWord[(ncBlockSum * j) + nBlockNo] = m_byDataCodeWord[nDataCwIndex++];}else{// 俀庬栚僽儘僢僋抂悢暘攝抲m_byAllCodeWord[(ncBlockSum * ncDataCw1) + i]  = m_byDataCodeWord[nDataCwIndex++];}	}++nBlockNo;
}// 僽儘僢僋暿俼俽僐乕僪儚乕僪悢(仸尰忬偱偼摨悢)
ncRSCw1 = QR_VersonInfo[m_nVersion].RS_BlockInfo1[nLevel].ncAllCodeWord - ncDataCw1;
ncRSCw2 = QR_VersonInfo[m_nVersion].RS_BlockInfo2[nLevel].ncAllCodeWord - ncDataCw2;/////////////////////////////////////////////////////////////////////////
// 俼俽僐乕僪儚乕僪嶼弌nDataCwIndex = 0;
nBlockNo = 0;for (i = 0; i < ncBlock1; ++i)
{memset(m_byRSWork, 0,sizeof(m_byRSWork));memmove(m_byRSWork, m_byDataCodeWord + nDataCwIndex, ncDataCw1);GetRSCodeWord(m_byRSWork, ncDataCw1, ncRSCw1);// 俼俽僐乕僪儚乕僪攝抲for (j = 0; j < ncRSCw1; ++j){m_byAllCodeWord[ncDataCodeWord + (ncBlockSum * j) + nBlockNo] = m_byRSWork[j];}nDataCwIndex += ncDataCw1;++nBlockNo;
}for (i = 0; i < ncBlock2; ++i)
{memset(m_byRSWork, 0,sizeof(m_byRSWork));memmove(m_byRSWork, m_byDataCodeWord + nDataCwIndex, ncDataCw2);GetRSCodeWord(m_byRSWork, ncDataCw2, ncRSCw2);// 俼俽僐乕僪儚乕僪攝抲for (j = 0; j < ncRSCw2; ++j){m_byAllCodeWord[ncDataCodeWord + (ncBlockSum * j) + nBlockNo] = m_byRSWork[j];}nDataCwIndex += ncDataCw2;++nBlockNo;
}m_nSymbleSize = m_nVersion * 4 + 17;// 儌僕儏乕儖攝抲
FormatModule();return TRUE;

}

int GetEncodeVersion(int nVersion, char *lpsSource, int ncLength)
{
int nVerGroup = nVersion >= 27 ? QR_VRESION_L : (nVersion >= 10 ? QR_VRESION_M : QR_VRESION_S);
int i, j;

for (i = nVerGroup; i <= QR_VRESION_L; ++i)
{if (EncodeSourceData(lpsSource, ncLength, i)){if (i == QR_VRESION_S){for (j = 1; j <= 9; ++j){if ((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])return j;}}else if (i == QR_VRESION_M){for (j = 10; j <= 26; ++j){if ((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])return j;}}else if (i == QR_VRESION_L){for (j = 27; j <= 40; ++j){if ((m_ncDataCodeWordBit + 7) / 8 <= QR_VersonInfo[j].ncDataCodeWord[m_nLevel])return j;}}}
}
return 0;

}

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 (IsNumeralData(lpsSource[i]))	byMode = QR_MODE_NUMERAL;			//数字else if (IsAlphabetData(lpsSource[i]))byMode = QR_MODE_ALPHABET;			//字符elsebyMode = 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; //如果合并后的数据超过长度 非法}elsencJoinFront = 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; //如果合并后的数据超过长度 非法}elsencJoinBehind = 0;//不满足合并的条件if (ncJoinFront != 0 && ncJoinBehind != 0)//前后的数据块合并后都不为0{nJoinPosition = (ncJoinFront < ncJoinBehind) ? -1 : 1;//位置的标记,如果前面的小于后面的为-1;大于等于为1}else{//如果有一个或者都为0		如果前面不为0为-1;后面不为0为1  否则为0nJoinPosition = (ncJoinFront != 0) ? -1 : ((ncJoinBehind != 0) ? 1 : 0);}if (nJoinPosition != 0){//如果合并后的数据不为0if (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模式,将新的数据块模式定义成8BITm_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也是8bitm_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];}
}return (m_ncDataCodeWordBit != -1);
//return TRUE;

}
//获取bit长度
int GetBitLength(unsigned char nMode, int ncData, int nVerGroup)
{
int ncBits = 0;

switch (nMode)
{
case QR_MODE_NUMERAL:ncBits = 4 + nIndicatorLenNumeral[nVerGroup] + (10 * (ncData / 3));switch (ncData % 3){case 1:ncBits += 4;break;case 2:ncBits += 7;break;default:break;}break;case QR_MODE_ALPHABET:ncBits = 4 + nIndicatorLenAlphabet[nVerGroup] + (11 * (ncData / 2)) + (6 * (ncData % 2));break;case QR_MODE_8BIT:ncBits = 4 + nIndicatorLen8Bit[nVerGroup] + (8 * ncData);break;default://ncBits = 4 + nIndicatorLenKanji[nVerGroup] + (13 * (ncData / 2));//本程序写法?ncBits = 4 + nIndicatorLenKanji[nVerGroup] + (13 * ncData);//文档算法break;
}return ncBits;

}
//设置bit流
int SetBitStream(int nIndex, unsigned short 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;

}
//是不是数字编码信息
//是返回TRUE,否返回FALSE
bool IsNumeralData(unsigned char c)
{
if (c >= ‘0’ && c <= ‘9’)
return TRUE;

return FALSE;

}
//是否是字符编码信息
//是返回TRUE,否返回FALSE
bool IsAlphabetData(unsigned char c)
{
if (c >= ‘0’ && c <= ‘9’)
return TRUE;

if (c >= 'A' && c <= 'Z')return TRUE;if (c == ' ' || c == '$' || c == '%' || c == '*' || c == '+' || c == '-' || c == '.' || c == '/' || c == ':')return TRUE;return FALSE;

}
//是否中文汉字信息
//是返回TRUE,否返回FALSE
bool IsKanjiData(unsigned char c1, unsigned char c2)
{

if (((c1 >= 0x81 && c1 <= 0x9f) || (c1 >= 0xe0 && c1 <= 0xeb)) && (c2 >= 0x40))
{if ((c1 == 0x9f && c2 > 0xfc) || (c1 == 0xeb && c2 > 0xbf))return FALSE;return TRUE;
}
return FALSE;

}

//字母表信息转化
unsigned char AlphabetToBinaly(unsigned char c)
{
if (c >= ‘0’ && c <= ‘9’) return (unsigned char)(c - ‘0’);

if (c >= 'A' && c <= 'Z') return (unsigned char)(c - 'A' + 10);if (c == ' ') return 36;if (c == '$') return 37;if (c == '%') return 38;if (c == '*') return 39;if (c == '+') return 40;if (c == '-') return 41;if (c == '.') return 42;if (c == '/') return 43;return 44;

}

unsigned short KanjiToBinaly(unsigned short wc)
{
if (wc >= 0x8140 && wc <= 0x9ffc)
wc -= 0x8140;
else
wc -= 0xc140;

return (unsigned short)(((wc >> 8) * 0xc0) + (wc & 0x00ff));

}

//纠错码
void GetRSCodeWord(unsigned char *lpbyRSWork, int ncDataCodeWord, int ncRSCodeWord)
{
int i, j;

for (i = 0; i < ncDataCodeWord ; ++i)
{if (lpbyRSWork[0] != 0){unsigned char nExpFirst = byIntToExp[lpbyRSWork[0]]; for (j = 0; j < ncRSCodeWord; ++j){unsigned char nExpElement = (unsigned char)(((int)(byRSExp[ncRSCodeWord][j] + nExpFirst)) % 255);lpbyRSWork[j] = (unsigned char)(lpbyRSWork[j + 1] ^ byExpToInt[nExpElement]);}for (j = ncRSCodeWord; j < ncDataCodeWord + ncRSCodeWord - 1; ++j)lpbyRSWork[j] = lpbyRSWork[j + 1];}else{for (j = 0; j < ncDataCodeWord + ncRSCodeWord - 1; ++j)lpbyRSWork[j] = lpbyRSWork[j + 1];}
}

}
//格式化数据存放,存在于所有的尺寸中,
//详见http://coolshell.cn/articles/10590.html#jtss-tsina
void FormatModule(void)
{
int i, j;
int nMinPenalty, nPenalty;

memset(m_byModuleData, 0, sizeof(m_byModuleData));
SetFunctionModule();	//首先把回字图案花在三个角上
SetCodeWordPattern();	//if (m_nMaskingNo == -1)
{m_nMaskingNo = 0;SetMaskingPattern(m_nMaskingNo); SetFormatInfoPattern(m_nMaskingNo); nMinPenalty = CountPenalty();for (i = 1; i <= 7; ++i){SetMaskingPattern(i); SetFormatInfoPattern(i); nPenalty = CountPenalty();if (nPenalty < nMinPenalty){nMinPenalty = nPenalty;m_nMaskingNo = i;}}
}SetMaskingPattern(m_nMaskingNo); 
SetFormatInfoPattern(m_nMaskingNo); for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize; ++j){m_byModuleData[i][j] = (unsigned char)((m_byModuleData[i][j] & 0x11) != 0);}
}

}

void SetFunctionModule(void)
{
int i, j;

SetFinderPattern(0, 0);					//三个回字坐标
SetFinderPattern(m_nSymbleSize - 7, 0);	
SetFinderPattern(0, m_nSymbleSize - 7);	for (i = 0; i < 8; ++i)
{m_byModuleData[i][7] = m_byModuleData[7][i] = '\x20';m_byModuleData[m_nSymbleSize - 8][i] = m_byModuleData[m_nSymbleSize - 8 + i][7] = '\x20';m_byModuleData[i][m_nSymbleSize - 8] = m_byModuleData[7][m_nSymbleSize - 8 + i] = '\x20';
}for (i = 0; i < 9; ++i)
{m_byModuleData[i][8] = m_byModuleData[8][i] = '\x20';
}for (i = 0; i < 8; ++i)
{m_byModuleData[m_nSymbleSize - 8 + i][8] = m_byModuleData[8][m_nSymbleSize - 8 + i] = '\x20';
}
SetVersionPattern();	//版本信息
for (i = 0; i < QR_VersonInfo[m_nVersion].ncAlignPoint; ++i)
{SetAlignmentPattern(QR_VersonInfo[m_nVersion].nAlignPoint[i], 6);//小回字SetAlignmentPattern(6, QR_VersonInfo[m_nVersion].nAlignPoint[i]);for (j = 0; j < QR_VersonInfo[m_nVersion].ncAlignPoint; ++j){SetAlignmentPattern(QR_VersonInfo[m_nVersion].nAlignPoint[i], QR_VersonInfo[m_nVersion].nAlignPoint[j]);					}
}for (i = 8; i <= m_nSymbleSize - 9; ++i)
{m_byModuleData[i][6] = (i % 2) == 0 ? '\x30' : '\x20';m_byModuleData[6][i] = (i % 2) == 0 ? '\x30' : '\x20';
}

}

void SetFinderPattern(int x, int y)
{
static unsigned char byPattern[] = {0x7f,
0x41,
0x5d,
0x5d,
0x5d,
0x41,
0x7f};
int i, j;

for (i = 0; i < 7; ++i)
{for (j = 0; j < 7; ++j){m_byModuleData[x + j][y + i] = (byPattern[i] & (1 << (6 - j))) ? '\x30' : '\x20'; }
}

}

void SetAlignmentPattern(int x, int y)
{
static unsigned char byPattern[] = {0x1f,
0x11,
0x15,
0x11,
0x1f};
int i, j;

if (m_byModuleData[x][y] & 0x20)return; x -= 2; y -= 2; for (i = 0; i < 5; ++i)
{for (j = 0; j < 5; ++j){m_byModuleData[x + j][y + i] = (byPattern[i] & (1 << (4 - j))) ? '\x30' : '\x20'; }
}

}

void SetVersionPattern(void)
{
int i, j;
int nVerData;

if (m_nVersion <= 6)//在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。return;nVerData = m_nVersion << 12;for (i = 0; i < 6; ++i)
{if (nVerData & (1 << (17 - i))){nVerData ^= (0x1f25 << (5 - i));}
}nVerData += m_nVersion << 12;for (i = 0; i < 6; ++i)
{for (j = 0; j < 3; ++j){m_byModuleData[m_nSymbleSize - 11 + j][i] = m_byModuleData[i][m_nSymbleSize - 11 + j] =(nVerData & (1 << (i * 3 + j))) ? '\x30' : '\x20';}
}

}

void SetCodeWordPattern(void)
{
int x = m_nSymbleSize;
int y = m_nSymbleSize - 1;

int nCoef_x = 1; 
int nCoef_y = 1; int i, j;for (i = 0; i < m_ncAllCodeWord; ++i)
{for (j = 0; j < 8; ++j){do{x += nCoef_x;nCoef_x *= -1;if (nCoef_x < 0){y += nCoef_y;if (y < 0 || y == m_nSymbleSize){y = (y < 0) ? 0 : m_nSymbleSize - 1;nCoef_y *= -1;x -= 2;if (x == 6) --x;}}}while (m_byModuleData[x][y] & 0x20); m_byModuleData[x][y] = (m_byAllCodeWord[i] & (1 << (7 - j))) ? '\x02' : '\x00';}
}

}
//设置遮蔽信息
void SetMaskingPattern(int nPatternNo)
{
int i, j;
bool bMask;
for (i = 0; i < m_nSymbleSize; ++i)
{
for (j = 0; j < m_nSymbleSize; ++j)
{
if (! (m_byModuleData[j][i] & 0x20))
{
switch (nPatternNo)
{
case 0:
bMask = ((i + j) % 2 == 0)?TRUE:FALSE;
break;

			case 1:bMask = (i % 2 == 0)?TRUE:FALSE;break;case 2:bMask = (j % 3 == 0)?TRUE:FALSE;break;case 3:bMask = ((i + j) % 3 == 0)?TRUE:FALSE;break;case 4:bMask = (((i / 2) + (j / 3)) % 2 == 0)?TRUE:FALSE;break;case 5:bMask = (((i * j) % 2) + ((i * j) % 3) == 0)?TRUE:FALSE;break;case 6:bMask = ((((i * j) % 2) + ((i * j) % 3)) % 2 == 0)?TRUE:FALSE;break;default: bMask = ((((i * j) % 3) + ((i + j) % 2)) % 2 == 0)?TRUE:FALSE;break;}m_byModuleData[j][i] = (unsigned char)((m_byModuleData[j][i] & 0xfe) | (((m_byModuleData[j][i] & 0x02) > 1) ^ bMask));}}
}

}
//设置格式化信息
void SetFormatInfoPattern(int nPatternNo)
{
int nFormatInfo;
int i;
int nFormatData;

switch (m_nLevel)
{
case QR_LEVEL_M:nFormatInfo = 0x00; break;case QR_LEVEL_L:nFormatInfo = 0x08; break;case QR_LEVEL_Q:nFormatInfo = 0x18; break;default: nFormatInfo = 0x10; break;
}nFormatInfo += nPatternNo;nFormatData = nFormatInfo << 10;for (i = 0; i < 5; ++i)
{if (nFormatData & (1 << (14 - i))){nFormatData ^= (0x0537 << (4 - i)); }
}nFormatData += nFormatInfo << 10;nFormatData ^= 0x5412;for (i = 0; i <= 5; ++i)m_byModuleData[8][i] = (nFormatData & (1 << i)) ? '\x30' : '\x20';m_byModuleData[8][7] = (nFormatData & (1 << 6)) ? '\x30' : '\x20';
m_byModuleData[8][8] = (nFormatData & (1 << 7)) ? '\x30' : '\x20';
m_byModuleData[7][8] = (nFormatData & (1 << 8)) ? '\x30' : '\x20';for (i = 9; i <= 14; ++i)m_byModuleData[14 - i][8] = (nFormatData & (1 << i)) ? '\x30' : '\x20';for (i = 0; i <= 7; ++i)m_byModuleData[m_nSymbleSize - 1 - i][8] = (nFormatData & (1 << i)) ? '\x30' : '\x20';m_byModuleData[8][m_nSymbleSize - 8] = '\x30';for (i = 8; i <= 14; ++i)m_byModuleData[8][m_nSymbleSize - 15 + i] = (nFormatData & (1 << i)) ? '\x30' : '\x20';

}

int CountPenalty(void)
{
int nPenalty = 0;
int i, j, k;
int nCount = 0, s_nCount;

for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize - 4; ++j){int nCount = 1;for (k = j + 1; k < m_nSymbleSize; k++){if (((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i][k] & 0x11) == 0))++nCount;elsebreak;}if (nCount >= 5){nPenalty += 3 + (nCount - 5);}j = k - 1;}
}for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize - 4; ++j){int nCount = 1;for (k = j + 1; k < m_nSymbleSize; k++){if (((m_byModuleData[j][i] & 0x11) == 0) == ((m_byModuleData[k][i] & 0x11) == 0))++nCount;elsebreak;}if (nCount >= 5){nPenalty += 3 + (nCount - 5);}j = k - 1;}
}for (i = 0; i < m_nSymbleSize - 1; ++i)
{for (j = 0; j < m_nSymbleSize - 1; ++j){if ((((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i + 1][j]		& 0x11) == 0)) &&(((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i]	[j + 1] & 0x11) == 0)) &&(((m_byModuleData[i][j] & 0x11) == 0) == ((m_byModuleData[i + 1][j + 1] & 0x11) == 0))){nPenalty += 3;}}
}for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize - 6; ++j){if (((j == 0) ||				 (! (m_byModuleData[i][j - 1] & 0x11))) && // 柧 傑偨偼 僔儞儃儖奜(   m_byModuleData[i][j]     & 0x11)   && // 埫 - 1(! (m_byModuleData[i][j + 1] & 0x11))  && // 柧 - 1(   m_byModuleData[i][j + 2] & 0x11)   && // 埫 劉(   m_byModuleData[i][j + 3] & 0x11)   && // 埫 劆3(   m_byModuleData[i][j + 4] & 0x11)   && // 埫 劊(! (m_byModuleData[i][j + 5] & 0x11))  && // 柧 - 1(   m_byModuleData[i][j + 6] & 0x11)   && // 埫 - 1((j == m_nSymbleSize - 7) || (! (m_byModuleData[i][j + 7] & 0x11))))   // 柧 傑偨偼 僔儞儃儖奜{if (((j < 2 || ! (m_byModuleData[i][j - 2] & 0x11)) && (j < 3 || ! (m_byModuleData[i][j - 3] & 0x11)) &&(j < 4 || ! (m_byModuleData[i][j - 4] & 0x11))) ||((j >= m_nSymbleSize - 8  || ! (m_byModuleData[i][j + 8]  & 0x11)) &&(j >= m_nSymbleSize - 9  || ! (m_byModuleData[i][j + 9]  & 0x11)) &&(j >= m_nSymbleSize - 10 || ! (m_byModuleData[i][j + 10] & 0x11)))){nPenalty += 40;}}}
}for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize - 6; ++j){if (((j == 0) ||				 (! (m_byModuleData[j - 1][i] & 0x11))) && // 柧 傑偨偼 僔儞儃儖奜(   m_byModuleData[j]    [i] & 0x11)   && // 埫 - 1(! (m_byModuleData[j + 1][i] & 0x11))  && // 柧 - 1(   m_byModuleData[j + 2][i] & 0x11)   && // 埫 劉(   m_byModuleData[j + 3][i] & 0x11)   && // 埫 劆3(   m_byModuleData[j + 4][i] & 0x11)   && // 埫 劊(! (m_byModuleData[j + 5][i] & 0x11))  && // 柧 - 1(   m_byModuleData[j + 6][i] & 0x11)   && // 埫 - 1((j == m_nSymbleSize - 7) || (! (m_byModuleData[j + 7][i] & 0x11))))   // 柧 傑偨偼 僔儞儃儖奜{if (((j < 2 || ! (m_byModuleData[j - 2][i] & 0x11)) && (j < 3 || ! (m_byModuleData[j - 3][i] & 0x11)) &&(j < 4 || ! (m_byModuleData[j - 4][i] & 0x11))) ||((j >= m_nSymbleSize - 8  || ! (m_byModuleData[j + 8][i]  & 0x11)) &&(j >= m_nSymbleSize - 9  || ! (m_byModuleData[j + 9][i]  & 0x11)) &&(j >= m_nSymbleSize - 10 || ! (m_byModuleData[j + 10][i] & 0x11)))){nPenalty += 40;}}}
}for (i = 0; i < m_nSymbleSize; ++i)
{for (j = 0; j < m_nSymbleSize; ++j){if (! (m_byModuleData[i][j] & 0x11)){++nCount;}}
}if( (50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize))) > 0)s_nCount = 50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize));
elses_nCount = 0 - (50 - ((nCount * 100) / (m_nSymbleSize * m_nSymbleSize)));
nPenalty += (s_nCount / 5) * 10;return nPenalty;

}
#endif

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. flutter 键盘弹出和收起页面bug

    场景我在客服系统中定义个列表widget和底层输入widget,但是在软键盘的弹出收起的时候,发现列表widget 并没有被重新绘制,这导致列表中的部分信息被遮挡, 1、Scaffold 首先想到的 Scaffold 的 resizeToAvoidBottomInset 属性。 在 Flutter 中 Scaffold 默认情况下 resizeToA…...

    2024/5/8 19:30:18
  2. 数列分块入门 (1 ~ 9)

    分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n​.对于区间加操作,我们可以先暴力左右两边,然后对于中间的整块的部分的加减,我们累加在块的标记上,然后我们每次查询的时候只要,…...

    2024/5/8 19:42:20
  3. 爬虫项目实战三:爬取抖音短视频

    爬取抖音网页版短视频目标项目准备网站分析反爬分析每一页的链接分析代码实现效果显示 目标 爬取抖音短视频,批量下载到本地。 项目准备 软件:Pycharm 第三方库:requests,fake_useragent,re 网站地址:http://douyin.bm8.com.cn/d_1.html 网站分析 打开网站。首先判断是静态…...

    2024/4/12 20:55:55
  4. 传入密码长度,随机生成密码及检测密码:必须由大写字母、小写字母、数字和特殊符号共同组成

    package com.test;import java.util.Random; import java.util.Scanner;public class Main {/*** 主方法** @param args*/public static void main(String[] args) {Scanner in = new Scanner(System.in);//传入密码长度int len = in.nextInt();//调用密码生成方法System.out.p…...

    2024/5/8 21:25:39
  5. 阿里云神坑RDS之数据库代理 (付费业务无通知)

    仔细读读希望您们别被这样坑了!可刺激了呢。1、点开阿里云控制台可以看到 云数据库RDS版 打开实例 会看到 数据库代理 如下2、上面作用说的很犀利了,我就说说它的不足之处吧! 1)这个代理开通后收费,是按照小时收费的 但是再开通时候并未明确说明收费内容和收费标准!2)该…...

    2024/4/28 0:35:29
  6. 【左神算法】栈逆序

    1.问题一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、 3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。2.codepackage com.ncst.offer.ch1.offer.ch2;/*** @author i* @create…...

    2024/4/29 1:33:52
  7. windows10系统右键菜单里面的字母是什么意思?

    我一直以为右键菜单的字母表示的是快捷键,所以有很多次我尝试使用CTRL+这些字母时,都没有效果。我还以为自己的键盘或者是字母本身显示有问题,查过之后才知道,原来这些字母的用法不是我们以为的快捷键。 右键字母的作用就是不需要鼠标,直接使用字母进行操作。键盘上的信息…...

    2024/5/2 7:18:33
  8. OCR技术助力钢铁物流实现智能管理

    价值成果通过使用百度OCR通用文字识别和iOCR自定义模板文字识别,帮助该钢铁物流平台解决了不同格式钢材的产品标签、码单、甚至有污损标签的识别,大幅提高了监管核验的自动化水平,实现了入库信息的快速采集,目前该物流已向合作的50余家钢厂进行了技术成果推介。案例故事核心…...

    2024/4/12 17:15:36
  9. 使用cmake构建一个大型项目框架

    1. 开篇介绍 在上篇文章当中,我们已经简单的写了一个cmake的框架,但是仍然存在不足这是上篇文章的目录结构,接下来对改文件结构进行修改。 . ├── bin │ └── main ├── build ├── CMakeLists.txt ├── include ├── lib │ ├── libprintfhellocmake.a…...

    2024/4/10 19:49:17
  10. MGRE网络类型-ospf-rip实验

    实验要求:R1-R2-R3为MGRE网络,R1为hub,R5-R6-R8为MGRE网络,R5为hubR3-R5之间为ppp封装R1-R2-R3-R5启用ospf协议,R1-R2-R3网络类型为BMAR3-R5之间启用ppp chap双向认证R5-R6-R8之间使用rip协议如上运行动态路由协议,实现全网可达R1-R2-R3为MGRE网络,R1为hub,R5-R6-R8为M…...

    2024/4/28 4:56:23
  11. 阿里云神坑RDS之数据库代理 (付费业务无提示)

    1、点开阿里云控制台可以看到 云数据库RDS版 打开实例 会看到 数据库代理 如下2、上面作用说的很犀利了,我就说说它的不足之处吧! 1)这个代理开通后收费,是按照小时收费的 但是再开通时候并未明确说明收费内容和收费标准!2)该功能开通后 并不会给账号管理员或者相应账号拥…...

    2024/4/11 0:53:08
  12. 【STM32F407开发板用户手册】第23章 STM32F407的USART串口基础知识和HAL库API

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第23章 STM32F407的USART串口基础知识和HAL库API本章节为大家讲解USART(Universal synchronous asynchronous receiver transmitter,通用同步异步收发器)的基础知识和对应的HAL库API。目录…...

    2024/4/22 19:13:05
  13. validate 基础使用 自定义验证 主动触发 修改错误提示的显示位置

    文章目录jquery validate 基础使用首先假设我们的 HTML 结构代码为表单添加基础验证 自定义提示信息添加自定义验证 (正则表达式验证)主动触发表单验证修改错误提示的显示位置最后是附上相关的验证规则以及相关操作jquery validate 基础使用 首先假设我们的 HTML 结构代码 &l…...

    2024/4/27 23:32:24
  14. 进入MySQL

    进入MySQL 方式一: mysql自带客户端 方式二: cmd上运行mysql: mysql -h localhost -P 3306 -u root -p (-h : host 本机 -P : 端口号 -u : 账号 -p :密码 3306为默认端口号)连本机直接 mysql -u root -p 即可退出:exit / ctrl+c...

    2024/4/16 21:08:08
  15. C语言读bin文件内容

    C语言读bin文件内容一、直接上代码,我这里是读显示器edid的内容,read_bin_file.c#include<stdio.h> #include<string.h> #include"edid.h"typedef unsigned char u8;typedef unsigned long int u32;/************************************************…...

    2024/4/24 20:09:42
  16. gunicorn部署flask项目简单示例

    一、WSGI协议Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。二、gunicorn介绍gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源…...

    2024/4/13 16:39:03
  17. HTTPD依赖包集合

    先进入光盘或镜像Package包中Httpd依赖包由apr、apr-util、pcre等安装包组成,依次或直接全部安装一下依赖包rpm -ivh apr-1.4.8-3.el7_4.1.x86_64.rpmrpm -ivh apr-devel-1.4.8-3.el7_4.1.x86_64.rpmrpm -ivh cyrus-sasl-2.1.26-23.el7.x86_64.rpmrpm -ivh cyrus-sasl-devel-2…...

    2024/4/14 17:44:29
  18. Flume+syslog+kafka

    一、概述 1、flume是什么Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Linux环境下运行。 Flume基于流式架构,容错性强,也很灵活简单,架构简单。 Flume、Kafka用来实时进行数据收集,Spark、Storm用来实时处理数据,impala用…...

    2024/4/17 11:32:05
  19. 做自媒体有什么省时的方法?

    随着互联网产业逐渐走向正规,15年到今天,短视频非常被大家青睐,其简单好上手、曝光作用毫无争议、项目投资产出非常优秀的优越性,故而吸引着无数有想发肯努力的人,因为各种原因,想弄到强大的转化收益,大家通常会铺设所有自媒体网站。但当我们的账号平台不断拓充,才明了…...

    2024/4/28 21:15:30
  20. 爬取瓜子二手车信息

    爬取瓜子二手车信息 import requests from lxml import etree #ctrl + F 局部查找 headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36,Cookie: uuid=ce8fca47-d9df-4aaa-8191-a0d…...

    2024/5/1 4:41:59

最新文章

  1. 26版SPSS操作教程(高级教程第十九章)

    目录 前言 粉丝及官方意见说明 第十九章一些学习笔记 第十九章一些操作方法 树模型、随机森林与最近邻元素法 树模型 数据准备 具体操作 结果解释 对案例的进一步分析 结果解释 考虑应用模型时的成本与收益 保存新数据 在选项中看错误分类成本和利润 结果解释…...

    2024/5/9 8:24:21
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 《QT实用小工具·十七》密钥生成工具

    1、概述 源码放在文章末尾 该项目主要用于生成密钥&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…...

    2024/5/2 18:50:50
  4. 数据结构--KMP算法

    数据结构–KMP算法 首先我在这里提出以下问题&#xff0c;一会一起进行探讨 1.什么是最长公共前后缀 2. KMP算法怎么实现对匹配原理 3. 最长公共前后缀怎么求解 KMP算法可以用来解决什么问题&#xff1f; 答&#xff1a;在字符串中匹配子串&#xff0c;也称为模式匹配 分析…...

    2024/5/5 0:48:22
  5. 蓝桥杯嵌入式学习笔记(6):IIC程序设计

    目录 前言 1. IIC基本原理 2. 电路原理 3. 代码编程 3.1 预备工作 3.2 AT24C02写读功能编写 3.2.1 AT24C02写操作实现 3.2.2 AT24C02读操作实现 3.3 MCP4017写读功能编写 3.3.1 MCP4017写操作实现 3.3.2 MCP4017读操作实现 3.4 main.c编写 3.4.1 头文件引用 3.4.…...

    2024/5/6 7:27:29
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/8 19:32:33
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/9 7:40:42
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/9 2:44:26
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/8 20:33:13
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/9 3:15:57
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/9 5:40:03
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/9 7:40:40
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/8 20:58:56
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/9 1:35:21
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/9 4:12:16
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/9 7:40:35
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/8 18:06:50
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/9 7:40:34
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/9 1:42:21
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/9 5:02:59
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/9 4:31:45
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/8 12:44:41
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/8 9:51:44
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/9 6:36:49
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/9 4:33:29
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57