Qt C++读写NFC标签NDEF网址URI
本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.1d292c1biFgjSs&ft=t&id=615391857885
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "QLibrary"
#include "QMessageBox"
#include <exception>unsigned char mypicoldkey[6]={0x19,0x74,0x02,0x02,0x01,0x11}; //旧密钥
unsigned char mypicnewkey[6]={0x19,0x74,0x02,0x02,0x01,0x11}; //新密钥,可自行设置//本示例可在windows、linux系统内编译、运行,自动判断windows系统加载DLL库、linux系统加载SO库----------------------------------------------------------------------------------------------------------------------------------------------
//让读写器发出声音
typedef unsigned char (*pcdbeep)(unsigned long xms);
#ifdef Q_OS_WINpcdbeep mypcdbeep = (pcdbeep)QLibrary("OUR_MIFARE.dll").resolve("pcdbeep");
#elsepcdbeep mypcdbeep = (pcdbeep)QLibrary("./libOURMIFARE.so").resolve("pcdbeep");
#endif//返回本读写器独一无二的设备编号
typedef unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
#ifdef Q_OS_WINpcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_MIFARE.dll").resolve("pcdgetdevicenumber");
#elsepcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURMIFARE.so").resolve("pcdgetdevicenumber");
#endif//清空MifareClass卡类标签NDEF数据缓冲typedef unsigned char (*tagbuf_clear)();
#ifdef Q_OS_WINtagbuf_clear mytagbuf_clear = (tagbuf_clear)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_clear");
#elsetagbuf_clear mytagbuf_clear = (tagbuf_clear)QLibrary("./libOURMIFARE.so").resolve("tagbuf_clear");
#endif//清空ForumType4类标签NDEF数据缓冲typedef unsigned char (*tagbuf_forumtype4_clear)();
#ifdef Q_OS_WINtagbuf_forumtype4_clear mytagbuf_forumtype4_clear = (tagbuf_forumtype4_clear)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_forumtype4_clear");
#elsetagbuf_forumtype4_clear mytagbuf_forumtype4_clear = (tagbuf_forumtype4_clear)QLibrary("./libOURMIFARE.so").resolve("tagbuf_forumtype4_clear");
#endif//轻松读Ntag卡
typedef unsigned char (*piccreadex_ntag)(unsigned char ctrlword,unsigned char *serial,unsigned char *pickey,unsigned char blockadd,unsigned char blocksize,unsigned char *picdata);
#ifdef Q_OS_WINpiccreadex_ntag mypiccreadex_ntag = (piccreadex_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccreadex_ntag");
#elsepiccreadex_ntag mypiccreadex_ntag = (piccreadex_ntag)QLibrary("./libOURMIFARE.so").resolve("piccreadex_ntag");
#endif//轻松读15693卡
typedef unsigned char (*iso15693readex)(unsigned char ctrlword,unsigned char afi,unsigned char startblock,unsigned char blocknum,unsigned char *uid,unsigned char *piccdatabuf);
#ifdef Q_OS_WINiso15693readex myiso15693readex = (iso15693readex)QLibrary("OUR_MIFARE.dll").resolve("iso15693readex");
#elseiso15693readex myiso15693readex = (iso15693readex)QLibrary("./libOURMIFARE.so").resolve("iso15693readex");
#endif//轻松读M1卡
typedef unsigned char (*piccreadex)(unsigned char ctrlword,unsigned char *serial,unsigned char area,unsigned char keyA1B0,unsigned char *picckey,unsigned char *piccdata0_2);
#ifdef Q_OS_WINpiccreadex mypiccreadex = (piccreadex)QLibrary("OUR_MIFARE.dll").resolve("piccreadex");
#elsepiccreadex mypiccreadex = (piccreadex)QLibrary("./libOURMIFARE.so").resolve("piccreadex");
#endif//寻forumtype4
typedef unsigned char (*forumtype4request)(unsigned char ctrlword,unsigned char *serial,unsigned char *seriallen);
#ifdef Q_OS_WINforumtype4request myforumtype4request = (forumtype4request)QLibrary("OUR_MIFARE.dll").resolve("forumtype4request");
#elseforumtype4request myforumtype4request = (forumtype4request)QLibrary("./libOURMIFARE.so").resolve("forumtype4request");
#endif//将ndef记录缓冲数据写入forumtype2标签
typedef unsigned char (*forumtype2_write_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *oldkey);
#ifdef Q_OS_WINforumtype2_write_ndeftag myforumtype2_write_ndeftag = (forumtype2_write_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype2_write_ndeftag");
#elseforumtype2_write_ndeftag myforumtype2_write_ndeftag = (forumtype2_write_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype2_write_ndeftag");
#endif//读取forumtype2标签信息
typedef unsigned char (*forumtype2_read_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *oldkey);
#ifdef Q_OS_WINforumtype2_read_ndeftag myforumtype2_read_ndeftag = (forumtype2_read_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype2_read_ndeftag");
#elseforumtype2_read_ndeftag myforumtype2_read_ndeftag = (forumtype2_read_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype2_read_ndeftag");
#endif//将ndef记录缓冲数据写入forumtype5 15693标签
typedef unsigned char (*forumtype5_write_ndeftag)(unsigned char ctrlword,unsigned char afi,unsigned char *serial);
#ifdef Q_OS_WINforumtype5_write_ndeftag myforumtype5_write_ndeftag = (forumtype5_write_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype5_write_ndeftag");
#elseforumtype5_write_ndeftag myforumtype5_write_ndeftag = (forumtype5_write_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype5_write_ndeftag");
#endif//读取forumtype5 15693标签信息
typedef unsigned char (*forumtype5_read_ndeftag)(unsigned char ctrlword,unsigned char afi,unsigned char *serial);
#ifdef Q_OS_WINforumtype5_read_ndeftag myforumtype5_read_ndeftag = (forumtype5_read_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype5_read_ndeftag");
#elseforumtype5_read_ndeftag myforumtype5_read_ndeftag = (forumtype5_read_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype5_read_ndeftag");
#endif//将ndef记录缓冲数据写入mifareclass标签
typedef unsigned char (*piccwrite_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *oldkey,unsigned char *newkey);
#ifdef Q_OS_WINpiccwrite_ndeftag mypiccwrite_ndeftag = (piccwrite_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("piccwrite_ndeftag");
#elsepiccwrite_ndeftag mypiccwrite_ndeftag = (piccwrite_ndeftag)QLibrary("./libOURMIFARE.so").resolve("piccwrite_ndeftag");
#endif//读取mifareclass标签信息
typedef unsigned char (*piccread_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *oldkey);
#ifdef Q_OS_WINpiccread_ndeftag mypiccread_ndeftag = (piccread_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("piccread_ndeftag");
#elsepiccread_ndeftag mypiccread_ndeftag = (piccread_ndeftag)QLibrary("./libOURMIFARE.so").resolve("piccread_ndeftag");
#endif//将ndef记录缓冲数据写入forumtype4标签
typedef unsigned char (*forumtype4_write_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *seriallen,unsigned char *newkey);
#ifdef Q_OS_WINforumtype4_write_ndeftag myforumtype4_write_ndeftag = (forumtype4_write_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype4_write_ndeftag");
#elseforumtype4_write_ndeftag myforumtype4_write_ndeftag = (forumtype4_write_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype4_write_ndeftag");
#endif//读取forumtype4标签信息
typedef unsigned char (*forumtype4_read_ndeftag)(unsigned char ctrlword,unsigned char *serial,unsigned char *seriallen,unsigned char *oldkey);
#ifdef Q_OS_WINforumtype4_read_ndeftag myforumtype4_read_ndeftag = (forumtype4_read_ndeftag)QLibrary("OUR_MIFARE.dll").resolve("forumtype4_read_ndeftag");
#elseforumtype4_read_ndeftag myforumtype4_read_ndeftag = (forumtype4_read_ndeftag)QLibrary("./libOURMIFARE.so").resolve("forumtype4_read_ndeftag");
#endif//解析缓冲区内NDEF记录tagbuf_read
typedef unsigned char (*tagbuf_read)(unsigned char *mypiccdata,unsigned char *revstrlen,unsigned char *recordnumber);
#ifdef Q_OS_WINtagbuf_read mytagbuf_read = (tagbuf_read)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_read");
#elsetagbuf_read mytagbuf_read = (tagbuf_read)QLibrary("./libOURMIFARE.so").resolve("tagbuf_read");
#endif//锁定Ntag标签页数据
typedef unsigned char (*picclock_ntag)(unsigned char locktype,unsigned char *mypicclockdata);
#ifdef Q_OS_WINpicclock_ntag mypicclock_ntag = (picclock_ntag)QLibrary("OUR_MIFARE.dll").resolve("picclock_ntag");
#elsepicclock_ntag mypicclock_ntag = (picclock_ntag)QLibrary("./libOURMIFARE.so").resolve("picclock_ntag");
#endif//初始化Ntag卡,开启读写卡密码保护功能
typedef unsigned char (*piccinit_ntag)(unsigned char ctrlword,unsigned char *serial,unsigned char *pickey,unsigned char *configdata);
#ifdef Q_OS_WINpiccinit_ntag mypiccinit_ntag = (piccinit_ntag)QLibrary("OUR_MIFARE.dll").resolve("piccinit_ntag");
#elsepiccinit_ntag mypiccinit_ntag = (piccinit_ntag)QLibrary("./libOURMIFARE.so").resolve("piccinit_ntag");
#endif//生成NDEF文本记录数据缓冲tagbuf_addtext
typedef unsigned char (*tagbuf_addtext)(unsigned char *languagecodestr,int languagecodestrlen,unsigned char *textstr,int textstrlen);
#ifdef Q_OS_WINtagbuf_addtext mytagbuf_addtext = (tagbuf_addtext)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addtext");
#elsetagbuf_addtext mytagbuf_addtext = (tagbuf_addtext)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addtext");
#endif//生成NDEF唤醒android.com:pkg APP
typedef unsigned char (*tagbuf_addapp)(unsigned char *packagestr,int packagestrlen);
#ifdef Q_OS_WINtagbuf_addapp mytagbuf_addapp = (tagbuf_addapp)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addapp");
#elsetagbuf_addapp mytagbuf_addapp = (tagbuf_addapp)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addapp");
#endif//生成NDEF唤醒任意类型APP
typedef unsigned char (*tagbuf_addapp1)(unsigned char *packagestr,int packagestrlen,unsigned char *typestr,int typelen);
#ifdef Q_OS_WINtagbuf_addapp1 mytagbuf_addapp1 = (tagbuf_addapp1)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addapp1");
#elsetagbuf_addapp1 mytagbuf_addapp1 = (tagbuf_addapp1)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addapp1");
#endif//生成NDEF网址URI记录数据缓冲tagbuf_adduri
typedef unsigned char (*tagbuf_adduri)(unsigned char *languagecodestr,int languagecodestrlen,unsigned char *textstr,int textstrlen,int uriheaderindex,unsigned char *uristr,int uristrlen);
#ifdef Q_OS_WINtagbuf_adduri mytagbuf_adduri = (tagbuf_adduri)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_adduri");
#elsetagbuf_adduri mytagbuf_adduri = (tagbuf_adduri)QLibrary("./libOURMIFARE.so").resolve("tagbuf_adduri");
#endif//生成NDEF蓝牙连接数据缓冲
typedef unsigned char (*tagbuf_addbluetooth)(unsigned char *blenamestr,int blenamestrlen,unsigned char *blemac);
#ifdef Q_OS_WINtagbuf_addbluetooth mytagbuf_addbluetooth = (tagbuf_addbluetooth)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addbluetooth");
#elsetagbuf_addbluetooth mytagbuf_addbluetooth = (tagbuf_addbluetooth)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addbluetooth");
#endif//生成NDEF热点wifi连接数据缓冲
typedef unsigned char (*tagbuf_addwifi)(unsigned char *ssidstr,int ssidstrlen,int authtype,int crypttype,unsigned char *keystr,int keystrlen);
#ifdef Q_OS_WINtagbuf_addwifi mytagbuf_addwifi = (tagbuf_addwifi)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addwifi");
#elsetagbuf_addwifi mytagbuf_addwifi = (tagbuf_addwifi)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addwifi");
#endif//生成NDEF电子名片数据缓冲
typedef unsigned char (*tagbuf_addbusinesscard)(unsigned char *infostr,int infostrlen);
#ifdef Q_OS_WINtagbuf_addbusinesscard mytagbuf_addbusinesscard = (tagbuf_addbusinesscard)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_addbusinesscard");
#elsetagbuf_addbusinesscard mytagbuf_addbusinesscard = (tagbuf_addbusinesscard)QLibrary("./libOURMIFARE.so").resolve("tagbuf_addbusinesscard");
#endif//生成NDEF新数据类型
typedef unsigned char (*tagbuf_adddata)(unsigned char *typestr,int typestrlen,unsigned char *datastr,int datastrlen);
#ifdef Q_OS_WINtagbuf_adddata mytagbuf_adddata = (tagbuf_adddata)QLibrary("OUR_MIFARE.dll").resolve("tagbuf_adddata");
#elsetagbuf_adddata mytagbuf_adddata = (tagbuf_adddata)QLibrary("./libOURMIFARE.so").resolve("tagbuf_adddata");
#endif//检测动态库文件是否在运行目录内----------------------------------------------------------------------------------------------------------------------------------------------------------
static bool checkdllos(){#ifdef Q_OS_WINQLibrary mylib("OUR_MIFARE.dll");if (!mylib.load()){ //判断windows系统下,OUR_MIFARE.dll是否在运行目录内QMessageBox::information(NULL, "提示", "请将OUR_MIFARE.dll文件拷贝到生成exe文件相同目录下!");return false;}else{return true;}#elseQLibrary mylib("./libOURMIFARE.so");if (!mylib.load()){ //判断linux系统下,libOURMIFARE.so是否正运行目录内QMessageBox::information(NULL, "提示", "请将libOURMIFARE.so文件拷贝到生成的运行文件相同目录下!");return false;}else{return true;}#endif
}//判断发卡器感应区内标签类型----------------------------------------------------------------------------------------------------------------------------------------------------------
static int checkcardtype(){unsigned char status;unsigned char myctrlword;unsigned char mypiccserial[8] ;unsigned char mypicdata[48] ;unsigned char mypickey[6]={0xff,0xff,0xff,0xff,0xff,0xff};unsigned char mypiccseriallen[1] ;myctrlword=0;status = mypiccreadex_ntag(myctrlword, mypiccserial, mypicoldkey, 4, 1, mypicdata);if(status==0){return 1;}else{status = myiso15693readex(myctrlword,0,0,1,mypiccserial,mypicdata);if(status==0){return 2;}else{myctrlword=23;status = mypiccreadex(myctrlword,mypiccserial,0,1,mypickey,mypicdata);if(status==0){return 3;}else{mypickey[0]=0xa0;mypickey[1]=0xa1;mypickey[2]=0xa2;mypickey[3]=0xa3;mypickey[4]=0xa4;mypickey[5]=0xa5;status = mypiccreadex(myctrlword,mypiccserial,0,1,mypickey,mypicdata);if(status==0){return 3;}else{myctrlword=0;status=myforumtype4request(myctrlword,mypiccserial,mypiccseriallen);if(status==0 || status==52){return 4;}else{return 0;}}}}}
}//Ntag标签开启或关闭密钥保护功能,推荐用此方法保护写入标签内的数据------------------------------------------------------------------------------------------------------------------------------------------------------
static int NtagKeyEn(unsigned char *mypiccserial,bool havekey,bool addkey){unsigned char myctrlword;unsigned char mypiccdata[16];if(havekey){myctrlword=0x10;}else{myctrlword=0;}if(addkey){ //开启密钥保护功能mypiccdata[0]=0;mypiccdata[1]=0;mypiccdata[2]=0;mypiccdata[3]=4; //有效数据是从第4块开始的myctrlword=myctrlword+1;mypiccdata[4]=0; //允许密钥认证失败次数 ,0表示不限制次数mypiccdata[5]=0;mypiccdata[6]=0;mypiccdata[7]=0; //启用计数器myctrlword=myctrlword+2;for(int i=0;i<4;i++){mypiccdata[8+i]=mypicnewkey[i]; //新认证密钥}mypiccdata[12]=0x16;mypiccdata[13]=0x16;mypiccdata[14]=0;mypiccdata[15]=4;myctrlword=myctrlword+4;}else{mypiccdata[0]=0;mypiccdata[1]=0;mypiccdata[2]=0;mypiccdata[3]=0xff;myctrlword=myctrlword+1;mypiccdata[4]=0;mypiccdata[5]=0;mypiccdata[6]=0;mypiccdata[7]=0;myctrlword=myctrlword+2;}unsigned char status=mypiccinit_ntag(myctrlword, mypiccserial, mypicoldkey, mypiccdata);
}//锁定ntag2数据页,锁定后标签不可以再次修改,请谨慎使用锁定功能----------------------------------------------------------------------------------------------------------------------------------------------------------
static int NtagPageLock(){unsigned char status;unsigned char mypicclockdata[4] ;mypicclockdata[0]=0;mypicclockdata[1]=0;mypicclockdata[2]=0xff;mypicclockdata[3]=0xff;status=mypicclock_ntag(0,mypicclockdata); //静态锁15块之前mypicclockdata[0]=0xff;mypicclockdata[1]=0xff;mypicclockdata[2]=0xff;mypicclockdata[3]=0;status=mypicclock_ntag(1,mypicclockdata); //动态锁15块之后
}//将ndef记录缓冲数据写入不同类型的NFC标签----------------------------------------------------------------------------------------------------------------------------------------------------------
void MainWindow::WriteDataBufToTag(){bool havelock;bool keyen;unsigned char status;unsigned char myctrlword;unsigned char mypiccserial[8] ;unsigned char mypiccseriallen[1] ;QString uidstr="" ;int i;if(ui->checkBox_before->isChecked()){havelock=true;}else{havelock=false;}if(ui->checkBox_later->isChecked()){keyen=true;}else{keyen=false;}int cardtype=checkcardtype();switch (cardtype){case 1:if(havelock){myctrlword=0x10;} else{myctrlword=0x00;}status=myforumtype2_write_ndeftag(myctrlword,mypiccserial,mypicoldkey);if(status==0){NtagKeyEn(mypiccserial,havelock,keyen);mypcdbeep(30);for (i = 0; i < 7; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}ui->listWidget->addItem("ForumType2Tag:"+uidstr+",NDEF记录缓冲写入成功!");}else{disperrinf(status);}break;case 2:myctrlword=0;status=myforumtype5_write_ndeftag(myctrlword,0,mypiccserial);if(status==0){mypcdbeep(30);for (i = 0; i < 8; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}ui->listWidget->addItem("ForumType5Tag:"+uidstr+",NDEF记录缓冲写入成功!");}else{disperrinf(status);}break;case 3:if(havelock){myctrlword=208;} else{myctrlword=144;}if(keyen){myctrlword=myctrlword+4;}status=mypiccwrite_ndeftag(myctrlword,mypiccserial,mypicoldkey,mypicnewkey);if(status==0){mypcdbeep(30);for (i = 0; i < 4; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}ui->listWidget->addItem("MifareclassTag:"+uidstr+",NDEF记录缓冲写入成功!");}else{disperrinf(status);}break;case 4:myctrlword=0;status=myforumtype4_write_ndeftag(myctrlword,mypiccserial,mypiccseriallen,mypicnewkey);if(status==0){mypcdbeep(30);for (i = 0; i < mypiccseriallen[0]; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}ui->listWidget->addItem("ForumType4Tag:"+uidstr+",NDEF记录缓冲写入成功!");}else{disperrinf(status);}break;default:QMessageBox::critical(NULL, "提示", "请刷有效的NFC标签");break;}
}//显示返回的错误代码信息-----------------------------------------------------------------------------------------------------------------------------------------------------------------
void MainWindow:: disperrinf(unsigned char result){switch (result) {case 8:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未寻到卡,请重新拿开卡后再放到感应区!");break;case 9:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",有多张卡在感应区,寻卡过程中防冲突失败,读序列吗错误!");break;case 10:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",该卡可能已被休眠,无法选中卡片!");break;case 11:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",密码装载失败!");break;case 12:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",卡片密码认证失败!");break;case 13:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",读页数据失败,可能需要验证密码!");break;case 14:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",写页数据失败,可能需要验证密码!");break;case 18:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",写UID失败,此卡可能不是UID卡!");break;case 22:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",动态库或驱动程序异常!");break;case 23:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",驱动程序错误或发卡器尚未安装!");break;case 24:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",操作超时,一般是动态库没有反应!");break;case 25:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",发送字数不够!");break;case 26:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",驱动程序错误或发卡器尚未安装!");break;case 27:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",操作超时,一般是动态库没有反应!");break;case 28:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",发送字数不够!");break;default:QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未知的错误信息!");break;}
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_beep_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在unsigned char status;status = mypcdbeep(30);if(status==0){}else{disperrinf(status);}
}void MainWindow::on_pushButton_getdevnum_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在unsigned char devicenumber[4]; //设备编号缓冲unsigned char status; //函数返回状态status = mypcdgetdevicenumber(devicenumber);if(status==0){mypcdbeep(30);QMessageBox::information(NULL, "提示", QString::asprintf("设备编号:%03d-%03d-%03d-%03d", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));}else{disperrinf(status);}
}void MainWindow::on_pushButton_clearbuff_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在mytagbuf_forumtype4_clear();mytagbuf_clear();QMessageBox::information(NULL, "提示", "NDEF数据缓冲已经清除!");
}void MainWindow::on_pushButton_writetag_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在WriteDataBufToTag();
}void MainWindow::on_pushButton_text_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString languagecodestr = "en"; //语言编码,英文为en,中文为zhQByteArray languagecodebuf=languagecodestr.toLocal8Bit();int languagecodestrlen=languagecodebuf.length();QString textstr=ui->lineEdit_text->text(); //文本QByteArray textbuf=textstr.toLocal8Bit();int textstrlen=textbuf.length();unsigned char status=mytagbuf_addtext((unsigned char *)languagecodebuf.data(),languagecodestrlen,(unsigned char *)textbuf.data(),textstrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF纯文本标签数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_comboBox_seleapp_currentTextChanged(const QString &arg1)
{QString seleappstr=ui->comboBox_seleapp->currentText();QStringList list = seleappstr.split("|");ui->lineEdit_appname->setText(list.at(1));
}void MainWindow::on_pushButton_App_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString packagestr=ui->lineEdit_appname->text().trimmed(); //app包名称QByteArray packagebuf=packagestr.toLocal8Bit();int packagestrlen=packagebuf.length();QString typestr=ui->comboBox_appstype->currentText(); //app类型QByteArray typebuf=typestr.toLocal8Bit();int typestrlen=typebuf.length();unsigned char status=mytagbuf_addapp1((unsigned char *)packagebuf.data(),packagestrlen,(unsigned char *)typebuf.data(),typestrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF启动应用数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Url_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString languagecodestr = "en"; //语言编码,英文为en,中文为zhQByteArray languagecodebuf=languagecodestr.toLocal8Bit();int languagecodestrlen=languagecodebuf.length();QString textstr=ui->lineEdit_title->text(); //标题QByteArray textbuf=textstr.toLocal8Bit();int textstrlen=textbuf.length();int uriheaderindex = ui->comboBox_headindex->currentIndex(); //前缀QString uristr=ui->lineEdit_uri->text(); //uriQByteArray uribuf=uristr.toLocal8Bit();int uristrlen=uribuf.length();unsigned char status=mytagbuf_adduri((unsigned char *)languagecodebuf.data(),languagecodestrlen,(unsigned char *)textbuf.data(),textstrlen,uriheaderindex,(unsigned char *)uribuf.data(),uristrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF网址URI记录数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Map_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString languagecodestr = "en"; //语言编码,英文为en,中文为zhQByteArray languagecodebuf=languagecodestr.toLocal8Bit();int languagecodestrlen=languagecodebuf.length();QString textstr=ui->lineEdit_mapname->text(); //标题QByteArray textbuf=textstr.toLocal8Bit();int textstrlen=textbuf.length();int uriheaderindex = 0; //地理位置没有链接前缀QString uristr="geo:" +ui->lineEdit_latitude->text().trimmed()+ ","+ui->lineEdit_longitude->text().trimmed() ; //uriQByteArray uribuf=uristr.toLocal8Bit();int uristrlen=uribuf.length();unsigned char status=mytagbuf_adduri((unsigned char *)languagecodebuf.data(),languagecodestrlen,(unsigned char *)textbuf.data(),textstrlen,uriheaderindex,(unsigned char *)uribuf.data(),uristrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF地图坐标数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Bluetooth_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString blenamestr=ui->lineEdit_Bluetoothname->text().trimmed(); //设备名称QByteArray blenamebuf=blenamestr.toLocal8Bit();int blenamestrlen=blenamebuf.length();QString macstr=ui->lineEdit_Bluetoothmac->text().trimmed(); //macQStringList list = macstr.split(":");unsigned char macbuf[6];try{for(int i=0;i<6;i++){bool ok;macbuf[i]=QString(list.at(i)).toInt(&ok,16);}}catch(_exception){QMessageBox::critical(NULL, "提示", "MAC地址输入错误!");return;}unsigned char status=mytagbuf_addbluetooth((unsigned char *)blenamebuf.data(),blenamestrlen,macbuf);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF蓝牙连接数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Wifi_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString ssidstr = ui->lineEdit_hostname->text(); //热点名称QByteArray ssidbuf=ssidstr.toLocal8Bit();int ssidstrlen=ssidbuf.length();int authtype=ui->comboBox_auth->currentIndex(); //认证方式int crypttype=ui->comboBox_Calculation->currentIndex(); //加密算法QString keystr=ui->lineEdit_password->text(); //密钥QByteArray keybuf=keystr.toLocal8Bit();int keystrlen=keybuf.length();unsigned char status=mytagbuf_addwifi((unsigned char *)ssidbuf.data(),ssidstrlen,authtype,crypttype,(unsigned char *)keybuf.data(),keystrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成WIFI无线连接数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Card_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString infostr = "BEGIN:VCARD\n" ;infostr=infostr+"VERSION:3.0" + "\n";infostr=infostr+"FN:" +ui->lineEdit_name->text()+ "\n";infostr=infostr+"TEL:"+ui->lineEdit_tel->text() + "\n";infostr=infostr+"ORG:"+ui->lineEdit_unilname->text() + "\n";infostr=infostr+"ADR:" +ui->lineEdit_address->text()+ "\n";infostr=infostr+"EMAIL:"+ui->lineEdit_email->text() + "\n";infostr=infostr+"URL:" +ui->lineEdit_net->text()+ "\n";infostr=infostr+"END:VCARD\n";QByteArray infobuf=infostr.toLocal8Bit();int infostrlen=infobuf.length();unsigned char status=mytagbuf_addbusinesscard((unsigned char *)infobuf.data(),infostrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF电子名片数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Data_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString typestr=ui->lineEdit_datatype->text().trimmed(); //类型名称QByteArray typebuf=typestr.toLocal8Bit();int typestrlen=typebuf.length();QString datastr=ui->lineEdit_data->text(); //数据QByteArray databuf=datastr.toLocal8Bit();int datastrlen=databuf.length();unsigned char status=mytagbuf_adddata((unsigned char *)typebuf.data(),typestrlen,(unsigned char *)databuf.data(),datastrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF数据标签缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_Call_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在QString languagecodestr = "en"; //语言编码,英文为en,中文为zhQByteArray languagecodebuf=languagecodestr.toLocal8Bit();int languagecodestrlen=languagecodebuf.length();QString textstr=""; //标题QByteArray textbuf=textstr.toLocal8Bit();int textstrlen=textbuf.length();int uriheaderindex = 5; //呼叫电话的链接前缀为5QString uristr=ui->lineEdit_callnum->text().trimmed() ; //uriQByteArray uribuf=uristr.toLocal8Bit();int uristrlen=uribuf.length();unsigned char status=mytagbuf_adduri((unsigned char *)languagecodebuf.data(),languagecodestrlen,(unsigned char *)textbuf.data(),textstrlen,uriheaderindex,(unsigned char *)uribuf.data(),uristrlen);if(status==0){QMessageBox::information(NULL, "提示"," 生成NDEF呼叫电话数据缓冲成功,可以向缓冲区继续添加记录,也可以将缓冲区内数据写标签。");}else {disperrinf(status);}
}void MainWindow::on_pushButton_cleatag_clicked()
{if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在mytagbuf_forumtype4_clear();mytagbuf_clear();WriteDataBufToTag();
}void MainWindow::on_pushButton_clearinf_clicked()
{ui->listWidget->clear();ui->plainTextEdit_taginf->setPlainText("");
}void MainWindow::on_pushButton_readtag_clicked()
{bool havelock;unsigned char status=8;unsigned char myctrlword;unsigned char mypiccserial[8] ;unsigned char mypiccseriallen[1] ;QString uidstr="" ;int i;if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在ui->plainTextEdit_taginf->setPlainText("");if(ui->checkBox_before->isChecked()){havelock=true;}else{havelock=false;} //标签是否已加密钥int cardtype=checkcardtype();switch (cardtype){case 1:if(havelock){myctrlword=0x10;} else{myctrlword=0x00;}status=myforumtype2_read_ndeftag(myctrlword,mypiccserial,mypicoldkey);uidstr="ForumType2Tag:";for (i = 0; i < 7; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}break;case 2:myctrlword=0;status=myforumtype5_read_ndeftag(myctrlword,0,mypiccserial);uidstr="ForumType5Tag:";for (i = 0; i < 8; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}break;case 3:myctrlword=144;status=mypiccread_ndeftag(myctrlword,mypiccserial,mypicoldkey);uidstr="MifareclassTag:";for (i = 0; i < 4; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}break;case 4:myctrlword=0;status=myforumtype4_read_ndeftag(myctrlword,mypiccserial,mypiccseriallen,mypicoldkey);uidstr="ForumType4Tag:";for (i = 0; i < mypiccseriallen[0]; i++) {uidstr=uidstr+QString::asprintf("%02X",mypiccserial[i]);}break;default:QMessageBox::critical(NULL, "提示", "请刷有效的NFC标签");break;}if(status==0){ui->listWidget->addItem(uidstr+",读取标签内信息成功!");mypcdbeep(30);unsigned char mypiccdata[1024];unsigned char revstrlen[2];unsigned char recordnumber[2];mytagbuf_read(mypiccdata,revstrlen,recordnumber);QString str = QString::fromLocal8Bit(reinterpret_cast<const char *>(mypiccdata));ui->plainTextEdit_taginf->setPlainText(str);}
}
相关文章:
Qt C++读写NFC标签NDEF网址URI
本示例使用的发卡器:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …...
[SMARTFORMS] 自定义SMARTFORMS表单页格式
在SMARTFORMS表单开发过程中,用户打印的纸张有可能不是标准的页格式,需要我自定义页格式 具体操作步骤如下所示 1.定义页格式 事务码SPAD,点击"完全管理" 点击"设备类型"中的页格式的"显示"按钮 点击创建按…...
大模型笔记:KV cache
1 为什么要使用KV cache 假设模型最终生成了四个token 对于第一个token,他的attention的计算方法为: 有了第一个token之后,生成第二个token的时候: sottmaxed表示已经逐行softmax后的结果同理,对于第三个token&…...
Android车机DIY开发之学习篇(三)替换Logo以正点原子为例
Android车机DIY开发之学习篇(三)替换Logo以正点原子为例 启动 logo 包括 u-boot 阶段 logo 内核阶段 logo /sdk/kernel-5.10 目录下替换 logo.bmp 654270 logo_kernel.bmp 654270 编译 Linux 内核...
宝塔面板 php8.0 安装 fileinfo 拓展失败
系统:Albaba Cloud Linux release 3 (OpenAnolis Editon)即 Centos 平替 异常提示: cc: fatal error: ** signal terminated program cc1 compilation terminated. make: *** [Makefile:211: libmagic/apprentice.lo] Error 1搜…...
机器学习数据预处理preprocessing
预处理方法预处理方法预处理方法BinarizerFunctionTransformerKBinsDiscretizerKernelCentererLabelBinarizerLabelEncoderMaxAbsScalerMinMaxScalerMultiLabelBinarizer sklearn.preprocessing.Binarizer 设定一个阈值(threshold),对于每个…...
网络安全 | 什么是Bot防护?
关注:CodingTechWork Bot防护介绍 随着互联网服务的普及和发展,越来越多的网站和应用遭遇了自动化攻击(Bot攻击)。Bot防护是一种安全技术,旨在检测和阻止自动化程序(即“机器人”或“bot”)对网…...
Qt学习笔记第81到90讲
第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册了解详情。 在widget.h内添加新的私有成员变量: QTimer *timer; 在widget类的构造…...
如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)
如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等) 如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…...
使用 Linux tracepoint、perf 和 eBPF 跟踪数据包
大家读完觉得有帮助记得关注和点赞!!! 目录 1 破局 1.1 逃离迷宫:上帝视角 1.2 网络跟踪:渴求利器 1.3 巨人肩膀:perf/eBPF 2 Perf 2.1 安装 perf 2.2 测试环境 2.3 初体验:跟踪 ping …...
给DevOps加点料:融入安全性的DevSecOps
从前,安全防护只是特定团队的责任,在开发的最后阶段才会介入。当开发周期长达数月、甚至数年时,这样做没什么问题;但是现在,这种做法现在已经行不通了。 采用 DevOps 可以有效推进快速频繁的开发周期(有时…...
MySQL视图笔记
视图的理解 ①视图是一种 虚拟表 ,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念。 ②视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。 ③对视图中的数据进行增加删除和修改,对应的数据表&a…...
【Ubuntu与Linux操作系统:十、C/C++编程】
第10章 C/C编程 10.1 Linux编程基础 Linux编程基础涵盖了C/C语言在Linux环境中的特点和使用方法。Linux以其高性能和开源特性成为系统编程的重要平台。 1. C语言与Linux的关系 Linux内核主要是用C语言编写的,因此学习C语言是理解Linux底层机制的必要前提。C语言的…...
豆包MarsCode:可以在线用的智能AI编程助手
大家好,今天我想和大家分享一个我最近发现的宝藏工具——豆包MarsCode。 作为一个程序员,我一直在寻找能够提高工作效率、快捷、 优化代码质量的在线编程工具。豆包MarsCode IDE,这个由字节跳动推出的智能编程助手,让我眼前一亮&…...
RabbitMQ基础(简单易懂)
RabbitMQ高级篇请看: RabbitMQ高级篇-CSDN博客 目录 什么是RabbitMQ? MQ 的核心概念 1. RabbitMQ 的核心组件 2. Exchange 的类型 3. 数据流向说明 如何安装RabbitQueue? WorkQueue(工作队列): Fa…...
UE5 使用内置组件进行网格切割
UE引擎非常强大,直接内置了网格切割功能并封装为蓝图节点,这项功能在UE4中就存在,并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型,需要配置一些参数。以UE5…...
【面试题】技术场景 6、Java 生产环境 bug 排查
生产环境 bug 排查思路 分析日志:首先通过分析日志查看是否存在错误信息,利用之前讲过的 elk 及查看日志的命令缩小查找错误范围,方便定位问题。远程 debug 适用环境:一般公司正式生产环境不允许远程 debug,多在测试环…...
macOS 安装tomcat9
macOS 安装tomcat9 URL:https://tomcat.apache.org/download-90.cgi 解压之后放到指定目录 /Users/lanren/install/tomcat-9 自己取个名字就行 给权限: ① 先进行权限修改:终端输入sudo chmod 755 /Users/lanren/install/tomcat-9/bin/…...
多线程之旅:属性及其基本操作
上次分享到了,多线程中是是如何创建的,那么接下来,小编继续分享下多线程的相关知识。 多线程中的一些基本属性。 基本属性 属性获取方法IDgetId()名称getName()状态getState()优先级getPriority()是否后台线程isDemo()是否存活isAlive()是…...
隧道网络:为数据传输开辟安全通道
什么是隧道网络? 想象一下,你正在一个陌生的城市旅行,并且想要访问家里的电脑。但是,直接连接是不可能的,因为家庭网络通常受到防火墙或路由器的保护,不允许外部直接访问。这时候,隧道网络&…...
Python爬虫-汽车之家各车系周销量榜数据
前言 本文是该专栏的第43篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-汽车之家各车系月销量榜数据》中,有详细介绍,如何爬取“各车系车型的月销量榜单数据”的方法以及完整代码教学教程。 而本文,笔者同样以汽车之家平台为例,…...
【机器学习】时序数据与序列建模:理论与实践的全面指南
云边有个稻草人-CSDN博客 目录 云边有个稻草人-CSDN博客 引言 一、时序数据的特点与挑战 1.1 时序数据的特点 1.2 序列建模的挑战 二、传统方法概览 2.1 ARIMA 模型 2.2 Prophet 三、深度学习方法 3.1 RNN 和 LSTM 3.2 Attention 和 Transformer 3.3 自监督学习 四、…...
java.net.SocketException: Connection reset 异常原因分析和解决方法
导致此异常的原因,总结下来有三种情况: 一、服务器端偶尔出现了异常,导致连接关闭 解决方法: 采用出错重试机制 二、 服务器端和客户端使用的连接方式不一致 解决方法: 服务器端和客户端使用相同的连接方式ÿ…...
【华为OD-E卷 - 恢复数字序列 100分(python、java、c++、js、c)】
【华为OD-E卷 - 恢复数字序列 100分(python、java、c、js、c)】 题目 对于一个连续正整数组成的序列,可以将其拼接成一个字符串,再将字符串里的部分字符打乱顺序。如序列8 9 10 11 12,拼接成的字符串为89101112&…...
05、Redis持久化
Redis是在内存中操作的,我们服器关闭重启机器后,正常是之前在redis中操作的数据都不存在了,但是实际上我们开机后重新启动redis服务,一样可以看到之前操作的数据。这是为什么呢? 我们在redis的安装目录下可以看到有一…...
Python爬虫基础——selenium模块进阶(模拟鼠标操作)
主要内容包括:模拟鼠标操作。常用的鼠标操作有单击、双击、右击、长按、拖动、移动等,模拟这些操作需要用到selenium模块中的ActionChains类。该类的基本使用方法是将实例化好的WebDriver对象作参数传到该类中,实例化成一个ActionChains对象&…...
C++ macro: The # operator
C macro: The # operator 1. The # operator2. Stringizing (字符串化)References 1. The # operator The # operator converts a parameter of a function-like macro into a character string literal. #define STR(x) #xAll subsequent invocations of the macro STR woul…...
一学就废|Python基础碎片,文件读写
文件处理是指通过编程接口对文件执行诸如创建、打开、读取、写入和关闭等操作的过程。它涉及管理程序与存储设备上的文件系统之间的数据流,确保数据得到安全高效的处理。 Python 中的文件模式 打开文件时,我们必须指定我们想要的模式,该模式…...
使用MATLAB正则表达式从文本文件中提取数据
使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…...
Java基于SSM框架的在线视频教育系统小程序【附源码、文档】
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
Git文件夹提交错了,怎么撤销?
最近提交了一些不应该提交的文件夹到git中,现在需要移除它们,现在简单记录一下操作日志: 情况一 文件夹已经被添加到 Git,但未提交 如果文件夹已经被 git add 添加到暂存区中,但尚未提交,你可以使用以下命令将其从暂存区中移除: git rm -r …...
Unity TextMesh Pro入门
概述 TextMesh Pro是Unity提供的一组工具,用于创建2D和3D文本。与Unity的UI文本和Text Mesh系统相比,TextMesh Pro提供了更好的文本格式控制和布局管理功能。 本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功…...
大疆C++开发面试题及参考答案
虚函数的作用是什么?虚函数机制是如何实现的?虚表指针在内存中的存放位置在哪里? 虚函数主要用于实现多态性。多态是面向对象编程中的一个重要概念,它允许通过基类指针或引用调用派生类中重写的函数。这样可以在运行时根据对象的实…...
极品飞车6里的赛道简介
极品飞车里有很多赛道,赛道分为前向赛道Forward、后向赛道Backward。前向赛道Forward是从A点到B点;后向赛道Backward是前向赛道的逆过程,即从B点到A点。这里介绍极品飞车6的赛道长度、中英文名称翻译、难度等级。 序号赛道英文名赛道中文名总长(km)急弯难度等级1Alpine Trai…...
Swagger学习⑰——@Link注解
介绍 Link 是 Swagger/OpenAPI 3.0 注解库中的一个注解,用于在 OpenAPI 文档中定义链接(Link)。链接是一种在 API 响应中提供相关操作或资源引用的机制,通常用于描述操作之间的关系或提供额外的操作提示。 Link 注解的作用 Link…...
Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
Cline(原Claude Dev)是一个开源的IDE AI插件,可以使用你的命令行界面和编辑器的人工智能助手。 你可以直接在VS Code编辑器进行安装。如果你使用过Cursor AI IDE的话,可以尝试最新发布的Cline3.1版本。 在OpenRouter上࿰…...
WEB前端-3.1
目录 CSS部分 什么是CSS CSS的书写方式 网页引入CSS的方式 css的颜色、大小、边线 文本和字体样式 CSS选择器 属性选择器 伪类选择器 伪元素选择器 文本样式 display属性 背景样式 精灵图、雪碧图 元素定位 绝对定位 相对定位 浮动定位 浮动 CSS部分 什么是…...
灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设
项目背景 本项目聚焦于黑龙江某一灌区的现代化改造工程,该灌区覆盖广阔,灌溉面积高达7.5万亩,地域上跨越6个乡镇及涵盖17个村庄。项目核心在于通过全面的信息化建设,强力推动节水灌溉措施的实施,旨在显著提升农业用水的…...
QT中引入OpenCV库总结(qmake方式和cmake方式)
文章目录 前言opencv环境配置一、opencv库获取的两种方式二、qmake和cmake配置2.1、 qmake2.2、cmake2.2.1、引入opencv示例 三、qt与opencv对应关系四、问题 前言 我的软件环境,写在前面 Windows10QT5.12.12VS2017OpenCV4.5.4 opencv环境配置 一、opencv库获取…...
【DAPM杂谈之三】DAPM的初始化流程
本文主要分析DAPM的设计与实现 内核的版本是:linux-5.15.164,下载链接:Linux内核下载 主要讲解有关于DAPM相关的知识,会给出一些例程并分析内核如何去实现的 /**************************************************************…...
消息队列架构、选型、专有名词解释
私人博客传送门 消息队列专有名词解释 | 魔筝炼药师 MQ选型 | 魔筝炼药师 MQ架构 | 魔筝炼药师 MQ顺序消息 | 魔筝炼药师...
Scala语言的计算机基础
Scala语言的计算机基础 Scala是一种现代的编程语言,兼具面向对象和函数式编程的特性,广泛应用于大数据处理、后端开发和分布式系统等领域。本文将围绕Scala语言的基础知识,包括其语法特点、数据结构、函数式编程思想、与Java的关系以及在实际…...
爬虫基础之爬取歌曲宝歌曲批量下载
声明:本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…...
书说 MySQL 的悲观锁和乐观锁
什么是乐观锁?什么是悲观锁? 悲观锁: 悲观锁是一种基于悲观态度的控制机制(最坏的程度想,每次并发一定会造成阻塞),用于防止数据冲突。它采取预防性措施,在修改数据之前将其锁定&a…...
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...
AIDD - 人工智能药物设计 -深度学习赋能脂质纳米颗粒设计,实现高效肺部基因递送
Nat. Biotechnol. | 深度学习赋能脂质纳米颗粒设计,实现高效肺部基因递送 今天为大家介绍的是来自美国麻省理工和爱荷华大学卡弗医学院团队的一篇论文。可离子化脂质(ionizable lipids)是脂质纳米颗粒(lipid nanoparticles&#…...
Selenium 进行网页自动化操作的一个示例,绕过一些网站的自动化检测。python编程
初级教程 selenium 教程和视频教程s原理与安装 - 白月黑羽 https://www.byhy.net/auto/selenium/01/#chrome%201 Selenium 自动化环境安装_哔哩哔哩_bilibili Selenium 自动化环境安装是Python Selenium Web自动化 2024版 - 自动化测试 爬虫的第2集视频,该合集共…...
力扣 岛屿数量
从某个点找,不断找相邻位置。 题目 岛屿中被“0”隔开后 ,是每一小块状的“1”,本题在问有多少块。可以用dfs进行搜索,遍历每一个点,把每一个点的上下左右做搜索检测,当检测到就标记为“0”表示已访问过&a…...
【前端动效】HTML + CSS 实现打字机效果
目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示,这次带来的是一个有趣的“擦除”效果,也可以叫做打字机效果,其中一段文本从左到右逐渐从…...
期刊(中英),期刊分区,期刊所在数据库(中英),出版商区别和联系
目录 对期刊、分区、数据库、出版商整体了解期刊(中英)期刊分区期刊所在数据库总结 出版商 对期刊、分区、数据库、出版商整体了解 下图是我对这四部分的一个理解,其中期刊根据论文使用语言分为中英两种,期刊分区是用来评判论文质…...