Qt C++ MF3 D21 D41 D81 Mifare Desfire EV1 EV2 EV3 DES、3K3DES、AES加解密、创建应用、读写文件源码,支持国产龙芯麒麟统信Linux系统
本文介绍了Qt C++基于OUR_MIFARE.dll动态库的Desfire卡操作示例,包含20个核心功能:1. 动态库加载与跨平台兼容处理;2. 卡片激活与信息获取;3. 应用选择与管理(AID操作);4. 密钥认证与修改;5. 文件操作(创建/读取/写入);6. 卡片格式化等。代码展示了完整的Desfire卡操作流程,包括密钥配置、应用管理、文件读写等关键功能,支持Windows/Linux平
·
本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.3edc645eGJtux3&ft=t&id=615391857885
Desfire EV1 EV2 EV3卡说明:
- AID:000000为PICC主应用,在主应用下EV1卡可以随意更改加解密方法,EV2/EV3卡从DES改为3K3DES/AES后不能再改回DES(返回917E的提示);
- 新出厂的卡片PICC 0号主控密钥为8字节的DES密钥,密钥为 00 00 00 00 00 00 00 00;
- 新创建的2K3DES、AES密钥16字节 ,密钥为 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00;
- 新创建的3K3DES 密钥24字节 ,密钥为 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00;
- 在非主应用下加解密方法是在创建应用时指定的,不能更改(返回911E或917E)。
一、加载发卡器驱动库
//本示例可在windows、linux系统内编译、运行
//判断windows、linux系统,声明动态库函数----------------------------------------------------------------------------------------------------------------------------------------------
//让读写器发出声音
typedef unsigned char (*pcdbeep)(unsigned long xms);
#ifdef Q_OS_WIN
pcdbeep mypcdbeep = (pcdbeep)QLibrary("OUR_MIFARE.dll").resolve("pcdbeep");
#else
pcdbeep mypcdbeep = (pcdbeep)QLibrary("./libOURMIFARE.so").resolve("pcdbeep");
#endif
//返回本读写器独一无二的设备编号
typedef unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
#ifdef Q_OS_WIN
pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_MIFARE.dll").resolve("pcdgetdevicenumber");
#else
pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURMIFARE.so").resolve("pcdgetdevicenumber");
#endif
//获取IC卡芯片型号
typedef unsigned char (*getmifareversion)(unsigned char *cardtypebuf,unsigned char *AtqaSak,unsigned char *versionbuf,unsigned char *versionlen,unsigned char *retsw);
#ifdef Q_OS_WIN
getmifareversion mygetmifareversion = (getmifareversion)QLibrary("OUR_MIFARE.dll").resolve("getmifareversion");
#else
getmifareversion mygetmifareversion = (getmifareversion)QLibrary("./libOURMIFARE.so").resolve("getmifareversion");
#endif
//激活发卡器上的desfire卡
typedef unsigned char (*cpurequest1)(unsigned char *mypiccserial,unsigned char *myparam,unsigned char *myver,unsigned char *mycode,unsigned char *AtqaSak);
#ifdef Q_OS_WIN
cpurequest1 mycpurequest1 = (cpurequest1)QLibrary("OUR_MIFARE.dll").resolve("cpurequest1");
#else
cpurequest1 mycpurequest1 = (cpurequest1)QLibrary("./libOURMIFARE.so").resolve("cpurequest1");
#endif
//选择卡内已有的应用
typedef unsigned char (*desfireselectapplication)(unsigned char *aidbuf,unsigned char *retsw);
#ifdef Q_OS_WIN
desfireselectapplication mydesfireselectapplication = (desfireselectapplication)QLibrary("OUR_MIFARE.dll").resolve("desfireselectapplication");
#else
desfireselectapplication mydesfireselectapplication = (desfireselectapplication)QLibrary("./libOURMIFARE.so").resolve("desfireselectapplication");
#endif
//EV1EV2EV3卡密钥认证
typedef unsigned char (*desfireauthkeyev1)(unsigned char *keybuf,unsigned char keyid,unsigned char authmode,unsigned char *retsw);
#ifdef Q_OS_WIN
desfireauthkeyev1 mydesfireauthkeyev1 = (desfireauthkeyev1)QLibrary("OUR_MIFARE.dll").resolve("desfireauthkeyev1");
#else
desfireauthkeyev1 mydesfireauthkeyev1 = (desfireauthkeyev1)QLibrary("./libOURMIFARE.so").resolve("desfireauthkeyev1");
#endif
//更改密钥
typedef unsigned char (*desfirechangekeyev1)(unsigned char *newkeybuf,unsigned char keyid,unsigned char authmode,unsigned char zeno,unsigned char *oldkeybuf,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirechangekeyev1 mydesfirechangekeyev1 = (desfirechangekeyev1)QLibrary("OUR_MIFARE.dll").resolve("desfirechangekeyev1");
#else
desfirechangekeyev1 mydesfirechangekeyev1 = (desfirechangekeyev1)QLibrary("./libOURMIFARE.so").resolve("desfirechangekeyev1");
#endif
//EV2EV3卡密钥认证
typedef unsigned char (*desfireauthkeyev2)(unsigned char *keybuf,unsigned char keyid,unsigned char authmode,unsigned char *retsw);
#ifdef Q_OS_WIN
desfireauthkeyev2 mydesfireauthkeyev2 = (desfireauthkeyev2)QLibrary("OUR_MIFARE.dll").resolve("desfireauthkeyev2");
#else
desfireauthkeyev2 mydesfireauthkeyev2 = (desfireauthkeyev2)QLibrary("./libOURMIFARE.so").resolve("desfireauthkeyev2");
#endif
//读取PICC密钥配置信息
typedef unsigned char (*desfiregetkeysettings)(unsigned char *aidbuf,unsigned char *keysetting,unsigned char *keysize,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiregetkeysettings mydesfiregetkeysettings = (desfiregetkeysettings)QLibrary("OUR_MIFARE.dll").resolve("desfiregetkeysettings");
#else
desfiregetkeysettings mydesfiregetkeysettings = (desfiregetkeysettings)QLibrary("./libOURMIFARE.so").resolve("desfiregetkeysettings");
#endif
//更改PICC主密钥配置
typedef unsigned char (*desfirechangekeysettings)(unsigned char *aidbuf,unsigned char keysetting,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirechangekeysettings mydesfirechangekeysettings = (desfirechangekeysettings)QLibrary("OUR_MIFARE.dll").resolve("desfirechangekeysettings");
#else
desfirechangekeysettings mydesfirechangekeysettings = (desfirechangekeysettings)QLibrary("./libOURMIFARE.so").resolve("desfirechangekeysettings");
#endif
//初始格式化卡片
typedef unsigned char (*desfireformatpicc)(unsigned char *retsw);
#ifdef Q_OS_WIN
desfireformatpicc mydesfireformatpicc = (desfireformatpicc)QLibrary("OUR_MIFARE.dll").resolve("desfireformatpicc");
#else
desfireformatpicc mydesfireformatpicc = (desfireformatpicc)QLibrary("./libOURMIFARE.so").resolve("desfireformatpicc");
#endif
//搜索PICC内所有应用aid
typedef unsigned char (*desfiregetapplicationids)(unsigned char *aidbuf,unsigned char *aidsize,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiregetapplicationids mydesfiregetapplicationids = (desfiregetapplicationids)QLibrary("OUR_MIFARE.dll").resolve("desfiregetapplicationids");
#else
desfiregetapplicationids mydesfiregetapplicationids = (desfiregetapplicationids)QLibrary("./libOURMIFARE.so").resolve("desfiregetapplicationids");
#endif
//创建新应用
typedef unsigned char (*desfirecreateapplication)(unsigned char *aidbuf,unsigned char keysetting,unsigned char keynumber,unsigned char keymode,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirecreateapplication mydesfirecreateapplication = (desfirecreateapplication)QLibrary("OUR_MIFARE.dll").resolve("desfirecreateapplication");
#else
desfirecreateapplication mydesfirecreateapplication = (desfirecreateapplication)QLibrary("./libOURMIFARE.so").resolve("desfirecreateapplication");
#endif
//删除应用
typedef unsigned char (*desfiredeleteapplication)(unsigned char *aidbuf,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiredeleteapplication mydesfiredeleteapplication = (desfiredeleteapplication)QLibrary("OUR_MIFARE.dll").resolve("desfiredeleteapplication");
#else
desfiredeleteapplication mydesfiredeleteapplication = (desfiredeleteapplication)QLibrary("./libOURMIFARE.so").resolve("desfiredeleteapplication");
#endif
//搜索当前应用内所有文件fid
typedef unsigned char (*desfiregetfileids)(unsigned char *fidbuf,unsigned char *fidsize,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiregetfileids mydesfiregetfileids = (desfiregetfileids)QLibrary("OUR_MIFARE.dll").resolve("desfiregetfileids");
#else
desfiregetfileids mydesfiregetfileids = (desfiregetfileids)QLibrary("./libOURMIFARE.so").resolve("desfiregetfileids");
#endif
//在应用内创建标准文件
typedef unsigned char (*desfirecreatestddatafile)(unsigned char fidbuf,unsigned char comset,unsigned char *accessrights,unsigned char filesize,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirecreatestddatafile mydesfirecreatestddatafile = (desfirecreatestddatafile)QLibrary("OUR_MIFARE.dll").resolve("desfirecreatestddatafile");
#else
desfirecreatestddatafile mydesfirecreatestddatafile = (desfirecreatestddatafile)QLibrary("./libOURMIFARE.so").resolve("desfirecreatestddatafile");
#endif
//在应用内创建备份文件
typedef unsigned char (*desfircreatebackupdatafile)(unsigned char fidbuf,unsigned char comset,unsigned char *accessrights,unsigned char filesize,unsigned char *retsw);
#ifdef Q_OS_WIN
desfircreatebackupdatafile mydesfircreatebackupdatafile = (desfircreatebackupdatafile)QLibrary("OUR_MIFARE.dll").resolve("desfircreatebackupdatafile");
#else
desfircreatebackupdatafile mydesfircreatebackupdatafile = (desfircreatebackupdatafile)QLibrary("./libOURMIFARE.so").resolve("desfircreatebackupdatafile");
#endif
//读取文件密钥配置信息
typedef unsigned char (*desfiregetfilesettings)(unsigned char fileid,unsigned char *filesettingsbuf,unsigned char *revbuflen,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiregetfilesettings mydesfiregetfilesettings = (desfiregetfilesettings)QLibrary("OUR_MIFARE.dll").resolve("desfiregetfilesettings");
#else
desfiregetfilesettings mydesfiregetfilesettings = (desfiregetfilesettings)QLibrary("./libOURMIFARE.so").resolve("desfiregetfilesettings");
#endif
//更改文件密钥配置信息
typedef unsigned char (*desfirechangefilesettings)(unsigned char fileid,unsigned char comset,unsigned char *accessrights,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirechangefilesettings mydesfirechangefilesettings = (desfirechangefilesettings)QLibrary("OUR_MIFARE.dll").resolve("desfirechangefilesettings");
#else
desfirechangefilesettings mydesfirechangefilesettings = (desfirechangefilesettings)QLibrary("./libOURMIFARE.so").resolve("desfirechangefilesettings");
#endif
//删除应用内的文件
typedef unsigned char (*desfiredeletefile)(unsigned char fileid,unsigned char *retsw);
#ifdef Q_OS_WIN
desfiredeletefile mydesfiredeletefile = (desfiredeletefile)QLibrary("OUR_MIFARE.dll").resolve("desfiredeletefile");
#else
desfiredeletefile mydesfiredeletefile = (desfiredeletefile)QLibrary("./libOURMIFARE.so").resolve("desfiredeletefile");
#endif
//读文件
typedef unsigned char (*desfirereaddata)(unsigned char cmd,unsigned char fileid,int rwbegin,int rwlen,unsigned char *databuf,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirereaddata mydesfirereaddata = (desfirereaddata)QLibrary("OUR_MIFARE.dll").resolve("desfirereaddata");
#else
desfirereaddata mydesfirereaddata = (desfirereaddata)QLibrary("./libOURMIFARE.so").resolve("desfirereaddata");
#endif
//写文件
typedef unsigned char (*desfirewritedata)(unsigned char cmd,unsigned char fileid,int rwbegin,int rwlen,unsigned char *databuf,unsigned char *retsw);
#ifdef Q_OS_WIN
desfirewritedata mydesfirewritedata = (desfirewritedata)QLibrary("OUR_MIFARE.dll").resolve("desfirewritedata");
#else
desfirewritedata mydesfirewritedata = (desfirewritedata)QLibrary("./libOURMIFARE.so").resolve("desfirewritedata");
#endif
//提交事务使备份生效
typedef unsigned char (*desfirecommittransaction)(unsigned char *retsw);
#ifdef Q_OS_WIN
desfirecommittransaction mydesfirecommittransaction = (desfirecommittransaction)QLibrary("OUR_MIFARE.dll").resolve("desfirecommittransaction");
#else
desfirecommittransaction mydesfirecommittransaction = (desfirecommittransaction)QLibrary("./libOURMIFARE.so").resolve("desfirecommittransaction");
#endif
//取消事务
typedef unsigned char (*desfireaborttransaction)(unsigned char *retsw);
#ifdef Q_OS_WIN
desfireaborttransaction mydesfireaborttransaction = (desfireaborttransaction)QLibrary("OUR_MIFARE.dll").resolve("desfireaborttransaction");
#else
desfireaborttransaction mydesfireaborttransaction = (desfireaborttransaction)QLibrary("./libOURMIFARE.so").resolve("desfireaborttransaction");
#endif
二、激活发卡器上的Desfire卡
void MainWindow::on_pushButton_request_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mycpurequest1 != NULL){
unsigned char AtqaSak[3];
unsigned char mycode[2];
unsigned char myver[2];
unsigned char myparam[4];
unsigned char mypiccserial[7];
unsigned char status =mycpurequest1(mypiccserial, myparam, myver, mycode, AtqaSak);
if(status==0 || status==52){
mypcdbeep(30);
QString parastr=QString::asprintf("%02X%02X%02X%02X", myparam[0], myparam[1], myparam[2], myparam[3]);
QString verstr=QString::asprintf("%02X", myver[0]);
QString codestr=QString::asprintf("%02X", mycode[0]);
QString cardhohex="";
if(AtqaSak[0] / 64>0){
for (int i=0;i<7;i++){cardhohex=cardhohex+QString::asprintf("%02X",mypiccserial[i]);}
ui->lineEdit_uid->setText(cardhohex);
QMessageBox::information(NULL, "提示", "激活Desfire卡成功,可以接着重复操作第二步进行调试了。\r\n16进制卡号:" + cardhohex+"\n芯片参数:"+parastr+"\n版本信息:"+verstr+"\n厂商代码:"+codestr);
}else{
for (int i=0;i<4;i++){cardhohex=cardhohex+QString::asprintf("%02X",mypiccserial[i]);}
ui->lineEdit_uid->setText(cardhohex);
QMessageBox::information(NULL, "提示", "激活Fm1208CPU卡成功,可以接着重复操作第二步进行调试了。\r\n16进制卡号:" + cardhohex+"\n芯片参数:"+parastr+"\n版本信息:"+verstr+"\n厂商代码:"+codestr);
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘cpurequest1’未正确载入,请查询DLL文件版本是否正确!");
}
}
三、选择卡内已有的APP应用AID
void MainWindow::on_pushButton_selectapp_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfireselectapplication != NULL){
QString aidstr=ui->lineEdit_aid->text().trimmed();
unsigned char aidbuf[3];
int checkbuflen=checkhexdata(aidstr,aidbuf);
if (checkbuflen!=3){
QMessageBox::critical(NULL, "提示", "AID输入错误,请输入3字节16进制AID!!");
ui->lineEdit_aid->setFocus();
return;
}
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfireselectapplication(aidbuf, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "选择卡内应用AID操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("选择卡内应用AID操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfireselectapplication’未正确载入,请查询DLL文件版本是否正确!");
}
}
四、密钥认证
void MainWindow::on_pushButton_authkeyev1_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfireauthkeyev1 != NULL){
int oldkeylen;
switch(ui->comboBox_ev123keymode->currentIndex()){
case 0:
oldkeylen=8;
break;
case 1:
oldkeylen=16;
break;
case 2:
oldkeylen=24;
break;
default:
oldkeylen=16;
}
unsigned char authkeybuf[24];
QString authkeystr=ui->lineEdit_ev123oldkey->text().trimmed();
int checkbuflen=checkhexdata(authkeystr,authkeybuf);
if (checkbuflen!=oldkeylen){
QMessageBox::critical(NULL, "提示", QString::asprintf("十六进制认证密钥输入错误,请输入 %d", oldkeylen)+ " 字节的16进制认证密钥!");
ui->lineEdit_ev123oldkey->setFocus();
return;
}
unsigned char keyid=ui->spinBox_keyid->value();
unsigned char keymode=ui->comboBox_ev123keymode->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfireauthkeyev1(authkeybuf,keyid, keymode,retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "认证密码操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("选认证密码操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfireauthkeyev1’未正确载入,请查询DLL文件版本是否正确!");
}
}
五、更改密钥
void MainWindow::on_pushButton_changekey_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirechangekeyev1 != NULL){
int keylen;
switch(ui->comboBox_newkeymode->currentIndex()){
case 0:
keylen=8;
break;
case 1:
keylen=16;
break;
case 2:
keylen=24;
break;
default:
keylen=16;
}
unsigned char newkeybuf[24];
QString newkeystr=ui->lineEdit_newkey->text().trimmed();
int checkbuflen=checkhexdata(newkeystr,newkeybuf);
if (checkbuflen!=keylen){
QMessageBox::critical(NULL, "提示", QString::asprintf("十六进制新密钥输入错误,请输入 %d", keylen)+ " 字节的16进制新密钥!");
ui->lineEdit_newkey->setFocus();
return;
}
unsigned char oldkeybuf[24];
QString oldkeystr=ui->lineEdit_ev123oldkey->text().trimmed();
checkbuflen=checkhexdata(oldkeystr,oldkeybuf);
if (checkbuflen!=keylen){
QMessageBox::critical(NULL, "提示", QString::asprintf("十六进制旧密钥输入错误,请输入 %d", keylen)+ " 字节的16进制旧密钥!");
ui->lineEdit_ev123oldkey->setFocus();
return;
}
unsigned char keyid=ui->spinBox_keyid->value();
unsigned char keymode=ui->comboBox_newkeymode->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfirechangekeyev1(newkeybuf, keyid, keymode,0,oldkeybuf, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "更改密码操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("更改密码操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirechangekeyev1’未正确载入,请查询DLL文件版本是否正确!");
}
}
六、获取PICC主控密钥配置信息
void MainWindow::on_pushButton_getpicckeyset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiregetkeysettings != NULL){
unsigned char aidbuf[3];
unsigned char keysetting[1];
unsigned char keysize[1];
unsigned char retsw[2]; //卡操作返回代码
for (int i=0;i<3;i++){aidbuf[i]=0x00;} //aid为000000时表示PICC
unsigned char status =mydesfiregetkeysettings(aidbuf, keysetting, keysize, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
if (keysetting[0] & 8>0){
ui->comboBox_picckeyset1->setCurrentIndex(1);
}else{ui->comboBox_picckeyset1->setCurrentIndex(0);}
if (keysetting[0] & 4>0){
ui->comboBox_picckeyset2->setCurrentIndex(1);
}else{ui->comboBox_picckeyset2->setCurrentIndex(0);}
if (keysetting[0] & 2>0){
ui->comboBox_picckeyset3->setCurrentIndex(1);
}else{ui->comboBox_picckeyset3->setCurrentIndex(0);}
if (keysetting[0] & 1>0){
ui->comboBox_picckeyset4->setCurrentIndex(1);
}else{ui->comboBox_picckeyset4->setCurrentIndex(0);}
int keynum=keysize[0] % 64;
QString keymodestr;
if (keysize[0] & 0xC0 == 0x80){
keymodestr="AES";
}else{
if (keysize[0] & 0xC0 == 0x40){
keymodestr = "3K3DES";
}else{keymodestr = "DES 或 2K3DES";}
}
QMessageBox::information(NULL, "提示", "读取PICC主密钥配置信息操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr)+QString::asprintf("\n密钥配置:%02X", keysetting[0])+QString::asprintf("\n密钥数量:%d",keynum)+"\n加密方式:"+keymodestr);
}else{
if (status==94){
QMessageBox::information(NULL, "提示", "请先执行选择AID为:000000 的PICC级应用!" );
ui->lineEdit_aid->setText("00 00 00");
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("读取PICC主密钥配置信息操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiregetkeysettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
七、更改PICC主控密钥配置
void MainWindow::on_pushButton_changepicckeyset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirechangekeysettings != NULL){
unsigned char aidbuf[3];
unsigned char keysetting=ui->comboBox_picckeyset1->currentIndex()*8+ui->comboBox_picckeyset2->currentIndex()*4+ui->comboBox_picckeyset3->currentIndex()*2+ui->comboBox_picckeyset4->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
for (int i=0;i<3;i++){aidbuf[i]=0x00;} //aid为000000时表示PICC
unsigned char status =mydesfirechangekeysettings(aidbuf, keysetting, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "更改PICC主密钥配置信息操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==63){
QMessageBox::critical(NULL, "提示", "需要先验证当前应用的主密钥!" );
}else{
if (status==94){
QMessageBox::critical(NULL, "提示", "先执行选择AID为:000000 的PICC级应用!" );
ui->lineEdit_aid->setText("00 00 00");
}else{QMessageBox::critical(NULL, "提示", QString::asprintf("更改PICC主密钥配置信息操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));}
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirechangekeysettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
八、搜索PICC内所有APP应用AID
void MainWindow::on_pushButton_getappids_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiregetapplicationids != NULL){
unsigned char aidbuf[57]; //应用AID号数据缓冲,每个AID号占用3个字节,最多19个应AID号
unsigned char aidsize[1]; //返回的应用数量,最大19个
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfiregetapplicationids(aidbuf, aidsize, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QString aidstr="";
if (aidsize[0]>0){
aidstr=QString::asprintf("应用AID:%02X%02X%02X", aidbuf[0],aidbuf[1],aidbuf[2]);
for (int i=1;i<aidsize[0];i++){aidstr=aidstr+QString::asprintf(",%02X%02X%02X", aidbuf[i*3],aidbuf[i*3+1],aidbuf[i*3+2]);}
}
QMessageBox::information(NULL, "提示", "搜索当前卡片内所有应用操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr)+QString::asprintf("\n应用数量:%d", aidsize[0])+"\n"+aidstr);
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("搜索当前卡片内所有应用操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiregetapplicationids’未正确载入,请查询DLL文件版本是否正确!");
}
}
九、创建新的APP应用
void MainWindow::on_pushButton_createapp_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirecreateapplication != NULL){
QString aidstr=ui->lineEdit_appid->text().trimmed();
unsigned char aidbuf[3];
int checkbuflen=checkhexdata(aidstr,aidbuf);
if (checkbuflen!=3){
QMessageBox::critical(NULL, "提示", "新AID输入错误,请输入3字节16进制AID!");
ui->lineEdit_appid->setFocus();
return;
}
if(aidbuf[0] + aidbuf[1] + aidbuf[2] == 0x00){
QMessageBox::critical(NULL, "提示", "新创建的应用不可以是AID为 000000 的PICC级应用!");
ui->lineEdit_appid->setFocus();
return;
}
unsigned char keysetting=ui->comboBox_appkeyset1->currentIndex()*16+ui->comboBox_appkeyset2->currentIndex()*8+ui->comboBox_appkeyset3->currentIndex()*4+ui->comboBox_appkeyset4->currentIndex()*2+ui->comboBox_appkeyset5->currentIndex();
unsigned char keynumber=ui->spinBox_appkeys->value();
unsigned char keymode=ui->comboBox_appkeymode->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfirecreateapplication(aidbuf, keysetting,keynumber,keymode, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "创建新应用操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("创建新应用操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirecreateapplication’未正确载入,请查询DLL文件版本是否正确!");
}
}
十、读取APP应用的密钥配置信息
void MainWindow::on_pushButton_getappkeyset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiregetkeysettings != NULL){
QString aidstr=ui->lineEdit_appid->text().trimmed();
unsigned char aidbuf[3];
int checkbuflen=checkhexdata(aidstr,aidbuf);
if (checkbuflen!=3){
QMessageBox::critical(NULL, "提示", "AID输入错误,请输入3字节16进制AID!");
ui->lineEdit_appid->setFocus();
return;
}
if(aidbuf[0] + aidbuf[1] + aidbuf[2] == 0x00){
QMessageBox::critical(NULL, "提示", "此处禁止操作AID为 000000 的PICC级应用!");
ui->lineEdit_appid->setFocus();
return;
}
unsigned char keysetting[1];
unsigned char keysize[1];
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfiregetkeysettings(aidbuf, keysetting, keysize, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
ui->comboBox_appkeyset1->setCurrentIndex(keysetting[0]/16);
if (keysetting[0] & 8>0){
ui->comboBox_appkeyset2->setCurrentIndex(1);
}else{ui->comboBox_appkeyset2->setCurrentIndex(0);}
if (keysetting[0] & 4>0){
ui->comboBox_appkeyset3->setCurrentIndex(1);
}else{ui->comboBox_appkeyset3->setCurrentIndex(0);}
if (keysetting[0] & 2>0){
ui->comboBox_appkeyset4->setCurrentIndex(1);
}else{ui->comboBox_appkeyset4->setCurrentIndex(0);}
if (keysetting[0] & 1>0){
ui->comboBox_appkeyset5->setCurrentIndex(1);
}else{ui->comboBox_appkeyset5->setCurrentIndex(0);}
int keynum=keysize[0] % 64;
ui->spinBox_appkeys->setValue(keynum);
if (keysize[0] & 0xC0 == 0x80){
ui->comboBox_appkeymode->setCurrentIndex(3);
}else{
if (keysize[0] & 0xC0 == 0x40){
ui->comboBox_appkeymode->setCurrentIndex(2);
}else{ui->comboBox_appkeymode->setCurrentIndex(0);} //DES 和 2K3DES 都可能
}
QMessageBox::information(NULL, "提示", "读取应用的密钥配置信息操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr)+QString::asprintf("\n密钥配置:%02X", keysetting[0]));
}else{
if (status==94){
QMessageBox::information(NULL, "提示", QString::asprintf("请先执行选择AID为:%02X%02X%02X", aidbuf[0],aidbuf[1],aidbuf[2]) +" 的应用!" );
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("读取应用的密钥配置信息操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiregetkeysettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
十一、更改APP应用的密钥配置值
void MainWindow::on_pushButton_changeappkeyset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirechangekeysettings != NULL){
QString aidstr=ui->lineEdit_appid->text().trimmed();
unsigned char aidbuf[3];
int checkbuflen=checkhexdata(aidstr,aidbuf);
if (checkbuflen!=3){
QMessageBox::critical(NULL, "提示", "AID输入错误,请输入3字节16进制AID!");
ui->lineEdit_appid->setFocus();
return;
}
if(aidbuf[0] + aidbuf[1] + aidbuf[2] == 0x00){
QMessageBox::critical(NULL, "提示", "此处禁止操作AID为 000000 的PICC级应用!");
ui->lineEdit_appid->setFocus();
return;
}
unsigned char keysetting=ui->comboBox_appkeyset1->currentIndex() * 16 + ui->comboBox_appkeyset2->currentIndex() * 8 + ui->comboBox_appkeyset3->currentIndex() * 4 + ui->comboBox_appkeyset4->currentIndex() * 2 + ui->comboBox_appkeyset5->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfirechangekeysettings(aidbuf, keysetting, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "更改应用密钥配置操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==63){
QMessageBox::critical(NULL, "提示", "需要先验证当前应用的主密钥!" );
}else{
if (status==94){
QMessageBox::critical(NULL, "提示", QString::asprintf("请先执行选择AID为:%02X%02X%02X", aidbuf[0],aidbuf[1],aidbuf[2]) +" 的应用!" );
}else{QMessageBox::critical(NULL, "提示", QString::asprintf("更改应用密钥配置信息操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));}
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirechangekeysettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
十二、删除PICC内已有的APP应用
void MainWindow::on_pushButton_deleteapp_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiredeleteapplication != NULL){
QString aidstr=ui->lineEdit_appid->text().trimmed();
unsigned char aidbuf[3];
int checkbuflen=checkhexdata(aidstr,aidbuf);
if (checkbuflen!=3){
QMessageBox::critical(NULL, "提示", "AID输入错误,请输入3字节16进制AID!");
ui->lineEdit_appid->setFocus();
return;
}
if(aidbuf[0] + aidbuf[1] + aidbuf[2] == 0x00){
QMessageBox::critical(NULL, "提示", "此处禁止操作AID为 000000 的PICC级应用!");
ui->lineEdit_appid->setFocus();
return;
}
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfiredeleteapplication(aidbuf, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "删除卡内应用操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("删除卡内应用操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiredeleteapplication’未正确载入,请查询DLL文件版本是否正确!");
}
}
十三、搜索当前APP应用内的所有文件fileid
void MainWindow::on_pushButton_getfileids_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiregetfileids != NULL){
unsigned char fidbuf[16]; //文件FID号数据缓冲,每个FID号占用1个字节,最多16个FID号
unsigned char fidsize[1]; //返回的文件数量,最多16个
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfiregetfileids(fidbuf, fidsize, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QString fidstr="";
if (fidsize[0]>0){
fidstr=QString::asprintf("文件ID:%d", fidbuf[0]);
for (int i=1;i<fidsize[0];i++){fidstr=fidstr+QString::asprintf(",%d", fidbuf[i]);}
}
QMessageBox::information(NULL, "提示", "搜索当前应用内所有文件ID操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr)+QString::asprintf("\n文件数量:%d", fidsize[0])+"\n"+fidstr);
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("搜索当前应用内所有文件ID操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiregetfileids’未正确载入,请查询DLL文件版本是否正确!");
}
}
十四、在当前APP应用内创建新的文件
void MainWindow::on_pushButton_createfile_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirecreatestddatafile != NULL && mydesfircreatebackupdatafile != NULL){
unsigned char comset; //通讯模式
if (ui->comboBox_filerwmode->currentIndex()<2){
comset=ui->comboBox_filerwmode->currentIndex();
}else{comset=3;}
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
unsigned char filesize=ui->spinBox_filesize->value(); //文件大小
unsigned char accessrights[2]; //文件密钥配置信息
accessrights[0]=ui->comboBox_RandW->currentIndex() * 16 + ui->comboBox_changefileset->currentIndex();
accessrights[1]=ui->comboBox_readonly->currentIndex() * 16 + ui->comboBox_writeonly->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status;
if (ui->radioButton_Standard->isChecked()){
status=mydesfirecreatestddatafile(fileid, comset, accessrights, filesize, retsw);
}else{status=mydesfircreatebackupdatafile(fileid, comset, accessrights, filesize, retsw);}
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "在应用内创建新文件操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==53){
QMessageBox::critical(NULL, "提示", QString::asprintf("在应用内创建新文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:CPU卡功能通讯错误,可能是卡拿开重放后未激活或卡不在感应区!");
}else{
if (status==57){
if(retstr == "91DE"){
QMessageBox::critical(NULL, "提示", QString::asprintf("在应用内创建新文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:可能的原因:1 应用没选择对,2 密码未认证,3 文件已存在!");
}else{QMessageBox::critical(NULL, "提示", QString::asprintf("在应用内创建新文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:请选择正确的应用!");}
}else{QMessageBox::critical(NULL, "提示", QString::asprintf("在应用内创建新文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));}
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirecreatestddatafile\mydesfircreatebackupdatafile’未正确载入,请查询DLL文件版本是否正确!");
}
}
十五、获取文件的密钥配置信息
void MainWindow::on_pushButton_getfileset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiregetfilesettings != NULL){
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
unsigned char filesettingsbuf[32]; //文件密钥配置缓冲
unsigned char revbuflen[2]; //长度
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfiregetfilesettings(fileid, filesettingsbuf, revbuflen, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
int revlen= revbuflen[0]+revbuflen[1]*256;
QString filesetstr="";
for (int i=1;i<revlen;i++){
filesetstr=filesetstr+QString::asprintf("%02X", filesettingsbuf[i]);
}
if (filesettingsbuf[1] % 4==3){ //解析通信模式
ui->comboBox_filerwmode->setCurrentIndex(2);
}else{
if (filesettingsbuf[1] % 4==1){
ui->comboBox_filerwmode->setCurrentIndex(1);
}else{ui->comboBox_filerwmode->setCurrentIndex(0);}
}
ui->comboBox_readonly->setCurrentIndex(filesettingsbuf[3] / 16); //只读时需要的密码号
ui->comboBox_writeonly->setCurrentIndex(filesettingsbuf[3] % 16); //只写时需要的密码号
ui->comboBox_RandW->setCurrentIndex(filesettingsbuf[2] / 16); //读写时需要的密码号
ui->comboBox_changefileset->setCurrentIndex(filesettingsbuf[2] % 16);//更改本配置时需要的密码号
int filesize=filesettingsbuf[4]+filesettingsbuf[5]*256+filesettingsbuf[6]*65536; //文件大小
ui->spinBox_filesize->setValue(filesize);
QMessageBox::information(NULL, "提示", "读取文件配置信息操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr)+"\n16进制文件配置信息:"+filesetstr);
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("读取文件配置信息操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiregetfilesettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
十六、更改文件的密钥配置值
void MainWindow::on_pushButton_changefileset_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirechangefilesettings != NULL){
unsigned char comset; //通讯模式
if (ui->comboBox_filerwmode->currentIndex()<2){
comset=ui->comboBox_filerwmode->currentIndex();
}else{comset=3;}
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
unsigned char accessrights[2]; //文件密钥配置信息
accessrights[0]=ui->comboBox_RandW->currentIndex() * 16 + ui->comboBox_changefileset->currentIndex();
accessrights[1]=ui->comboBox_readonly->currentIndex() * 16 + ui->comboBox_writeonly->currentIndex();
unsigned char retsw[2]; //卡操作返回代码
unsigned char status=mydesfirechangefilesettings(fileid, comset, accessrights, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "更改文件配置操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==53){
QMessageBox::critical(NULL, "提示", QString::asprintf("更改文件配置操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:CPU卡功能通讯错误,可能是卡拿开重放后未激活或卡不在感应区!");
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("更改文件配置操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirechangefilesettings’未正确载入,请查询DLL文件版本是否正确!");
}
}
十七、删除APP内已有的文件
void MainWindow::on_pushButton_deletefile_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfiredeletefile != NULL){
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
unsigned char retsw[2]; //卡操作返回代码
unsigned char status=mydesfiredeletefile(fileid, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "删除文件操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("删除文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfiredeletefile’未正确载入,请查询DLL文件版本是否正确!");
}
}
十八、读文件
void MainWindow::on_pushButton_readdata_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirereaddata != NULL){
ui->plainTextEdit_rwdata->setPlainText("");
unsigned char cmd=0xBD; //函数第1个参数为&HBD表示读数据,为&hBB表示读记录
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
int rwbegin=ui->spinBox_begin->value(); //读起始地址
int rwlen=ui->spinBox_rwsize->value(); //读取数据长度
unsigned char databuf[8192];
unsigned char retsw[2]; //卡操作返回代码
unsigned char status=mydesfirereaddata(cmd,fileid, rwbegin, rwlen,databuf, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QString datastr="";
for (int i=0;i<rwlen;i++){
datastr=datastr+QString::asprintf("%02X ", databuf[i]);
}
ui->plainTextEdit_rwdata->setPlainText(datastr);
QMessageBox::information(NULL, "提示", "读文件操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==63){
QMessageBox::critical(NULL, "提示", QString::asprintf("读文件操作返回异常:%d", status)+"\n说明:权限不足,请先用正确的密钥号认证!");
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("读文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirereaddata’未正确载入,请查询DLL文件版本是否正确!");
}
}
十九、写文件
void MainWindow::on_pushButton_writedata_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfirewritedata != NULL){
int rwlen=ui->spinBox_rwsize->value(); // 数据长度
if (rwlen<1){
QMessageBox::critical(NULL, "提示", "请输入要写入文件的数据字节数!");
ui->spinBox_rwsize->setFocus();
return;
}
QString datastr=ui->plainTextEdit_rwdata->toPlainText();
unsigned char databuf[rwlen];
int checkbuflen=checkhexdata(datastr,databuf);
if (checkbuflen!=rwlen){
QMessageBox::critical(NULL, "提示", QString::asprintf("写数据输入错误,请输入 %d", rwlen)+ " 个字节16进制的数据!");
ui->plainTextEdit_rwdata->setFocus();
return;
}
unsigned char cmd=0x3D; //函数第1个参数为&H3D表示写数据,为&h3B表示写记录
unsigned char fileid=ui->spinBox_fileid->value(); //文件ID
int rwbegin=ui->spinBox_begin->value(); //读起始地址
unsigned char retsw[2]; //卡操作返回代码
unsigned char status=mydesfirewritedata(cmd,fileid, rwbegin, rwlen,databuf, retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "写文件操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
if (status==63){
QMessageBox::critical(NULL, "提示", QString::asprintf("写文件操作返回异常:%d", status)+"\n说明:权限不足,请先用正确的密钥号认证!");
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("写文件操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘desfirewritedata’未正确载入,请查询DLL文件版本是否正确!");
}
}
二十、初始格式化PICC
void MainWindow::on_pushButton_formatpicc_clicked()
{
if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
if (mydesfireformatpicc != NULL){
unsigned char retsw[2]; //卡操作返回代码
unsigned char status =mydesfireformatpicc(retsw);
QString retstr =QString::asprintf("%02X%02X", retsw[0], retsw[1]);
if (status==0){
QMessageBox::information(NULL, "提示", "初始格式化卡操作卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}else{
QMessageBox::critical(NULL, "提示", QString::asprintf("初始格式化卡操作返回异常:%d", status)+"卡片返回代码:" + retstr+"\n说明:"+RetTextFromStr(retstr));
}
}else{
QMessageBox::critical(NULL, "提示", "函数‘esfireformatpicc’未正确载入,请查询DLL文件版本是否正确!");
}
}
更多推荐
所有评论(0)