本示例使用的发卡器:https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.3edc645eGJtux3&ft=t&id=615391857885

Desfire EV1 EV2 EV3卡说明:

  1. AID:000000为PICC主应用,在主应用下EV1卡可以随意更改加解密方法,EV2/EV3卡从DES改为3K3DES/AES后不能再改回DES(返回917E的提示);
  2. 新出厂的卡片PICC 0号主控密钥为8字节的DES密钥,密钥为 00 00 00 00 00 00 00 00;
  3. 新创建的2K3DES、AES密钥16字节 ,密钥为 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00;
  4. 新创建的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;
  5. 在非主应用下加解密方法是在创建应用时指定的,不能更改(返回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文件版本是否正确!");
    }
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐