• Qt_C++读写FM1208 CPU卡源码、支持windows、Linux系统


    本示例使用的发卡器: Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com)

    1. #include "mainwindow.h"
    2. #include "./ui_mainwindow.h"
    3. #include
    4. #include "QLibrary"
    5. #include "QMessageBox"
    6. //电话、微信:13822155058
    7. //QQ:954486673
    8. //本示例可在windows、linux系统内编译、运行
    9. //判断windows、linux系统,声明动态库函数----------------------------------------------------------------------------------------------------------------------------------------------
    10. //让读写器发出声音
    11. typedef unsigned char (*pcdbeep)(unsigned long xms);
    12. #ifdef Q_OS_WIN
    13. pcdbeep mypcdbeep = (pcdbeep)QLibrary("OUR_MIFARE.dll").resolve("pcdbeep");
    14. #else
    15. pcdbeep mypcdbeep = (pcdbeep)QLibrary("./libOURMIFARE.so").resolve("pcdbeep");
    16. #endif
    17. //返回本读写器独一无二的设备编号
    18. typedef unsigned char (*pcdgetdevicenumber)(unsigned char *devicenumber);
    19. #ifdef Q_OS_WIN
    20. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("OUR_MIFARE.dll").resolve("pcdgetdevicenumber");
    21. #else
    22. pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)QLibrary("./libOURMIFARE.so").resolve("pcdgetdevicenumber");
    23. #endif
    24. //CPU卡寻卡及将卡复位到14443A-4的指令状态
    25. typedef unsigned char (*cpurequest)(unsigned char *serial,unsigned char *param,unsigned char *cosver,unsigned char *code);
    26. #ifdef Q_OS_WIN
    27. cpurequest mycpurequest = (cpurequest)QLibrary("OUR_MIFARE.dll").resolve("cpurequest");
    28. #else
    29. cpurequest mycpurequest = (cpurequest)QLibrary("./libOURMIFARE.so").resolve("cpurequest");
    30. #endif
    31. //cpu卡初始化函数,(ctrlword是否需要先清空卡,不需要清空的话,可以需输入卡密码,卡密码长度)ctrlword_0是否先清空卡,分配空间(字节数)
    32. typedef unsigned char (*cpursinit)(unsigned char ctrlword,unsigned char *key,unsigned char *keylen,int customsize);
    33. #ifdef Q_OS_WIN
    34. cpursinit mycpursinit = (cpursinit)QLibrary("OUR_MIFARE.dll").resolve("cpursinit");
    35. #else
    36. cpursinit mycpursinit = (cpursinit)QLibrary("./libOURMIFARE.so").resolve("cpursinit");
    37. #endif
    38. //增加易写文件(文件序号0~5,文件只读密码:长度,文件读写密码,长度,分配空间)
    39. typedef unsigned char (*cpursfileadd_s)(unsigned char fileno,unsigned char *readonlykey,unsigned char *readonlykeylen,unsigned char *writekey,unsigned char *writekeylen,int customsize);
    40. #ifdef Q_OS_WIN
    41. cpursfileadd_s mycpursfileadd_s = (cpursfileadd_s)QLibrary("OUR_MIFARE.dll").resolve("cpursfileadd_s");
    42. #else
    43. cpursfileadd_s mycpursfileadd_s = (cpursfileadd_s)QLibrary("./libOURMIFARE.so").resolve("cpursfileadd_s");
    44. #endif
    45. //增加标准文件(文件序号0~5,文件只读密码:长度,文件读写密码,长度,分配空间)
    46. typedef unsigned char (*cpursfileadd)(unsigned char fileno,unsigned char *readonlykey,unsigned char *readonlykeylen,unsigned char *writekey,unsigned char *writekeylen,int customsize);
    47. #ifdef Q_OS_WIN
    48. cpursfileadd mycpursfileadd = (cpursfileadd)QLibrary("OUR_MIFARE.dll").resolve("cpursfileadd");
    49. #else
    50. cpursfileadd mycpursfileadd = (cpursfileadd)QLibrary("./libOURMIFARE.so").resolve("cpursfileadd");
    51. #endif
    52. //修改文件密码,修改后,请妥慎记住,否则该文件将无法再用
    53. typedef unsigned char (*cpursfilekeychg)(unsigned char fileno,unsigned char ctrword,unsigned char *oldkey,unsigned char *oldkeylen,unsigned char *newkey,unsigned char *newkeylen);
    54. #ifdef Q_OS_WIN
    55. cpursfilekeychg mycpursfilekeychg = (cpursfilekeychg)QLibrary("OUR_MIFARE.dll").resolve("cpursfilekeychg");
    56. #else
    57. cpursfilekeychg mycpursfilekeychg = (cpursfilekeychg)QLibrary("./libOURMIFARE.so").resolve("cpursfilekeychg");
    58. #endif
    59. //读文件数据(文件序号,读写密码,密码长度,读取起始位置,读取长度,读出内容)
    60. typedef unsigned char (*cpursfiledataread)(unsigned char fileno,unsigned char ctrword,unsigned char *oldkey,unsigned char *oldkeylen,int startaddr,unsigned char *databuf,int datalen);
    61. #ifdef Q_OS_WIN
    62. cpursfiledataread mycpursfiledataread = (cpursfiledataread)QLibrary("OUR_MIFARE.dll").resolve("cpursfiledataread");
    63. #else
    64. cpursfiledataread mycpursfiledataread = (cpursfiledataread)QLibrary("./libOURMIFARE.so").resolve("cpursfiledataread");
    65. #endif
    66. //写普通文件数据(文件序号,写密码,密码长度,写起始位置,写长度,写入内容)
    67. typedef unsigned char (*cpursfiledatawrite)(unsigned char fileno,unsigned char ctrword,unsigned char *oldkey,unsigned char *oldkeylen,int startaddr,unsigned char *databuf,int datalen);
    68. #ifdef Q_OS_WIN
    69. cpursfiledatawrite mycpursfiledatawrite = (cpursfiledatawrite)QLibrary("OUR_MIFARE.dll").resolve("cpursfiledatawrite");
    70. #else
    71. cpursfiledatawrite mycpursfiledatawrite = (cpursfiledatawrite)QLibrary("./libOURMIFARE.so").resolve("cpursfiledatawrite");
    72. #endif
    73. //写易写文件数据(文件序号,写密码,密码长度,写起始位置,写长度,写入内容)
    74. typedef unsigned char (*cpursfiledatawrite_s)(unsigned char fileno,unsigned char ctrword,unsigned char *oldkey,unsigned char *oldkeylen,int startaddr,unsigned char *databuf,int datalen);
    75. #ifdef Q_OS_WIN
    76. cpursfiledatawrite_s mycpursfiledatawrite_s = (cpursfiledatawrite_s)QLibrary("OUR_MIFARE.dll").resolve("cpursfiledatawrite_s");
    77. #else
    78. cpursfiledatawrite_s mycpursfiledatawrite_s = (cpursfiledatawrite_s)QLibrary("./libOURMIFARE.so").resolve("cpursfiledatawrite_s");
    79. #endif
    80. //强制清空卡,用cpursinit函数成功初始化过后,如果卡密码丢去了,可以尝试用以下的强制清空卡函数清空卡至出厂状态
    81. typedef unsigned char (*cpurscardclr)();
    82. #ifdef Q_OS_WIN
    83. cpurscardclr mycpurscardclr = (cpurscardclr)QLibrary("OUR_MIFARE.dll").resolve("cpurscardclr");
    84. #else
    85. cpurscardclr mycpurscardclr = (cpurscardclr)QLibrary("./libOURMIFARE.so").resolve("cpurscardclr");
    86. #endif
    87. //修改卡密码,卡密码和文件没有任何关系,卡密码只是用来清空卡,读和写文件是无效的。
    88. typedef unsigned char (*cpurscardkeychg)(unsigned char *oldkey,unsigned char *oldkeylen,unsigned char *newkey,unsigned char *newkeylen);
    89. #ifdef Q_OS_WIN
    90. cpurscardkeychg mycpurscardkeychg = (cpurscardkeychg)QLibrary("OUR_MIFARE.dll").resolve("cpurscardkeychg");
    91. #else
    92. cpurscardkeychg mycpurscardkeychg = (cpurscardkeychg)QLibrary("./libOURMIFARE.so").resolve("cpurscardkeychg");
    93. #endif
    94. const unsigned char NEWKEYR = 0x00; //'更改只读密码
    95. const unsigned char NEWKEYWR = 0x01; //'更改读写密码
    96. const unsigned char OLDKEYR = 0x00; //'用只读密码认证
    97. const unsigned char OLDKEYWR = 0x02; //'用读写密码认证
    98. //检测输入数据是否为16进制数------------------------------------------------------------------------------------------------------------------------------------------------------------
    99. static bool checkinput(QString inputstr){
    100. QString inputyes="0123456789abcdefABCDEF";
    101. for(int i=0;ilength();i++){
    102. if(inputyes.contains(inputstr.mid(i,1),Qt::CaseSensitive)){
    103. }else{return false;}
    104. }
    105. return true;
    106. }
    107. //检测输入数据是否为16进制数,将正确的16进制字符存入数组,并返回长度------------------------------------------------------------------------------------------------------------------------------------------------------------
    108. static int checkhexdata(QString inputstr,unsigned char *databuf){
    109. QChar ch;
    110. QString writinf = inputstr.trimmed();
    111. QString writinf1 = "";
    112. int m = 0;
    113. int n = 0;
    114. char s;
    115. if(writinf.length()<1){
    116. return -1;
    117. }
    118. ch = writinf.at(0);
    119. s = writinf.at(0).toLatin1();
    120. for(int i=0; ilength() ; i++)
    121. {
    122. ch = writinf.at(i);
    123. s = writinf.at(i).toLatin1();
    124. if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
    125. {
    126. writinf1 += ch;
    127. n++;
    128. if(n==2){
    129. bool ok;
    130. databuf[m++] = writinf1.toInt(&ok,16);
    131. writinf1 = "";
    132. n = 0;
    133. }
    134. }
    135. else if(s == ' '){
    136. }
    137. }
    138. return m;
    139. }
    140. //检测动态库文件是否在运行目录内----------------------------------------------------------------------------------------------------------------------------------------------------------
    141. static bool checkdllos(){
    142. #ifdef Q_OS_WIN
    143. QLibrary mylib("OUR_MIFARE.dll");
    144. if (!mylib.load()){ //判断windows系统下,OUR_MIFARE.dll是否在运行目录内
    145. QMessageBox::information(NULL, "提示", "请将OUR_MIFARE.dll文件拷贝到生成exe文件相同目录下!");
    146. return false;
    147. }else{
    148. return true;
    149. }
    150. #else
    151. QLibrary mylib("./libOURMIFARE.so");
    152. if (!mylib.load()){ //判断linux系统下,libOURMIFARE.so是否正运行目录内
    153. QMessageBox::information(NULL, "提示", "请将libOURMIFARE.so文件拷贝到生成的运行文件相同目录下!");
    154. return false;
    155. }else{return true;}
    156. #endif
    157. }
    158. //显示返回的错误代码信息-----------------------------------------------------------------------------------------------------------------------------------------------------------------
    159. static void disperrinf(unsigned char result){
    160. switch (result) {
    161. case 8:
    162. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未寻到卡,请重新拿开卡后再放到感应区!");
    163. break;
    164. case 50:
    165. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",RATS错误,厂家调试代码,用户不需理会!");
    166. break;
    167. case 51:
    168. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",PPS错误,厂家调试代码,用户不需理会!");
    169. break;
    170. case 52:
    171. QMessageBox::information(NULL, "提示", QString::asprintf("代码:%d", result)+",已进入了14443-4协议状态,可进行CPU卡功能所有操作了!");
    172. break;
    173. case 53:
    174. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",CPU卡功能通讯错误!");
    175. break;
    176. case 54:
    177. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",数据不足,需要接着发送未完成的数据至卡上!");
    178. break;
    179. case 55:
    180. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",发送ACK指令给卡,让卡接着发送数据回来!");
    181. break;
    182. case 56:
    183. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",清空根目录失败!");
    184. break;
    185. case 57:
    186. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",卡片不支持此功能!");
    187. break;
    188. case 58:
    189. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",卡片初始化失败!");
    190. break;
    191. case 59:
    192. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",分配的空间不足!");
    193. break;
    194. case 60:
    195. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",本次操作的实体已存在!");
    196. break;
    197. case 61:
    198. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",无足够空间!");
    199. break;
    200. case 62:
    201. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",文件不存在!");
    202. break;
    203. case 63:
    204. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",权限不足,有可能是用只读密码认证,导致无法更改读写密码或无法写文件!");
    205. break;
    206. case 64:
    207. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",密码不存在,或密钥文件未创建!");
    208. break;
    209. case 65:
    210. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",传送长度错误!");
    211. break;
    212. case 66:
    213. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",Le错误,即接收的数据长度指定过大!");
    214. break;
    215. case 67:
    216. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",功能不支持或卡中无MF 或卡片已锁定!");
    217. break;
    218. case 68:
    219. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",密码认证错识次数过多,该密码已被锁死!");
    220. break;
    221. case 70:
    222. case 71:
    223. case 72:
    224. case 73:
    225. case 74:
    226. case 75:
    227. case 76:
    228. case 77:
    229. case 78:
    230. case 79:
    231. case 80:
    232. case 81:
    233. case 82:
    234. case 83:
    235. case 84:
    236. case 85:
    237. QMessageBox::critical(NULL, "提示", QString::asprintf("密码错误,剩余次数为:%d", result-70)+",如果为0,该密码将锁死,无法再认证!");
    238. break;
    239. case 86:
    240. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",更改后的密码长度必须和创建时的长度一致!");
    241. break;
    242. case 87:
    243. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",应用目录不存在!");
    244. break;
    245. case 88:
    246. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",应用文件不存在!");
    247. break;
    248. case 89:
    249. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",文件号不能超过5!");
    250. break;
    251. case 90:
    252. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",读取文件时返回的长度不足,数据可能不正确!");
    253. break;
    254. case 91:
    255. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",一次读文件的长度不能超过255!");
    256. break;
    257. case 92:
    258. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",一次写文件的长度不能超过247!");
    259. break;
    260. default:
    261. QMessageBox::critical(NULL, "提示", QString::asprintf("错误代码:%d", result)+",未知的错误信息!");
    262. break;
    263. }
    264. }
    265. MainWindow::MainWindow(QWidget *parent)
    266. : QMainWindow(parent)
    267. , ui(new Ui::MainWindow)
    268. {
    269. ui->setupUi(this);
    270. QPalette pa;
    271. pa.setColor(QPalette::WindowText,QColor(255, 0, 0));
    272. ui->label_7->setPalette(pa);
    273. ui->label_8->setPalette(pa);
    274. ui->label_9->setPalette(pa);
    275. ui->label_19->setPalette(pa);
    276. }
    277. MainWindow::~MainWindow()
    278. {
    279. delete ui;
    280. }
    281. void MainWindow::on_pb_beep_clicked()
    282. {
    283. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    284. unsigned char status;
    285. if (mypcdbeep != NULL){ //是否成功连接上 pcdbeep()函数
    286. status = mypcdbeep(30);
    287. if(status==0){
    288. }
    289. else
    290. {
    291. disperrinf(status);
    292. }
    293. } else{
    294. QMessageBox::critical(NULL, "提示", "函数‘pcdbeep’未正确载入,请查询DLL文件版本是否正确!");
    295. }
    296. }
    297. void MainWindow::on_pb_getdevnum_clicked()
    298. {
    299. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    300. unsigned char devicenumber[4]; //设备编号缓冲
    301. unsigned char status; //函数返回状态
    302. if (mypcdgetdevicenumber != NULL){ //是否成功连接上 pcdgetdevicenumber()函数
    303. status = mypcdgetdevicenumber(devicenumber);
    304. if(status==0){
    305. mypcdbeep(30);
    306. QMessageBox::information(NULL, "提示", QString::asprintf("设备编号:%03d-%03d-%03d-%03d", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));
    307. }
    308. else
    309. {
    310. disperrinf(status);
    311. }
    312. }else{
    313. QMessageBox::critical(NULL, "提示", "函数‘pcdgetdevicenumber’未正确载入,请查询DLL文件版本是否正确!");
    314. }
    315. }
    316. void MainWindow::on_pb_request_clicked()
    317. {
    318. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    319. unsigned char mypiccserial[4]; //卡序列号
    320. unsigned char myparam[4]; //参数
    321. unsigned char myver[1]; //版本
    322. unsigned char mycode[1]; //厂商代码(复旦为90)
    323. unsigned char status; //函数返回状态
    324. if (mycpurequest != NULL){ //是否成功连接上 cpurequest()函数
    325. status = mycpurequest(mypiccserial,myparam,myver,mycode);
    326. if(status==0 || status==52){
    327. mypcdbeep(30);
    328. QString uidstr=QString::asprintf("%02X%02X%02X%02X", mypiccserial[0],mypiccserial[1],mypiccserial[2],mypiccserial[3]);
    329. QString parstr=QString::asprintf("%02X%02X%02X%02X", myparam[0],myparam[1],myparam[2],myparam[3]);
    330. QString verstr=QString::asprintf("%02X", myver[0]);
    331. QString codestr=QString::asprintf("%02X", mycode[0]);
    332. ui->lineEdit_uid->setText(uidstr);
    333. QMessageBox::information(NULL, "提示", "卡号:"+uidstr+",参数:"+parstr+",版本号:"+verstr+",厂商代码:"+codestr+" 的CPU卡已激活进入14443-4协议模式,可以继续以下的功能操作!");
    334. }
    335. else
    336. {
    337. disperrinf(status);
    338. }
    339. }else{
    340. QMessageBox::critical(NULL, "提示", "函数‘cpurequest’未正确载入,请查询DLL文件版本是否正确!");
    341. }
    342. }
    343. void MainWindow::on_pb_init_clicked()
    344. {
    345. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    346. unsigned char status; //函数返回状态
    347. unsigned char ctrlword; //是否先清空卡
    348. unsigned char mylen[1]; //密钥长度
    349. unsigned char keybuf[20]; //密钥
    350. int keylen;
    351. int spacesize; //空间大小
    352. if(ui->checkBox_clear->isChecked()){
    353. ctrlword=1;
    354. }else{ctrlword=0;}
    355. QString writinf = ui->lineEdit_cardkey->text().trimmed();
    356. keylen=checkhexdata(writinf,keybuf);
    357. if(keylen<0){
    358. QMessageBox::critical(NULL, "提示", "请输入正确的16进制卡密码!");
    359. ui->lineEdit_cardkey->setFocus();
    360. return;
    361. }
    362. mylen[0]=keylen;
    363. spacesize=ui->spinBox_maxsize->value();
    364. if (mycpursinit != NULL){ //是否成功连接上 cpursinit()函数
    365. status = mycpursinit(ctrlword,keybuf,mylen,spacesize);
    366. if(status==0 ){
    367. mypcdbeep(30);
    368. QMessageBox::information(NULL, "提示", "CPU卡初始化成功!");
    369. }
    370. else
    371. {
    372. disperrinf(status);
    373. }
    374. }else{
    375. QMessageBox::critical(NULL, "提示", "函数‘cpursinit’未正确载入,请查询DLL文件版本是否正确!");
    376. }
    377. }
    378. void MainWindow::on_pb_addeasyfile_clicked()
    379. {
    380. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    381. unsigned char status; //函数返回状态
    382. unsigned char fileno; //文件号
    383. unsigned char readkeylen[1]; //只读密钥长度
    384. unsigned char readkeybuf[20]; //只读密钥
    385. unsigned char rwkeylen[1]; //读写密钥长度
    386. unsigned char rwkeybuf[20]; //读写密钥
    387. int keylen;
    388. int spacesize; //空间大小
    389. QString keystr;
    390. fileno=ui->comboBox_addfile->currentIndex(); //新增加的文件号
    391. keystr = ui->lineEdit_readkey->text().trimmed();
    392. keylen=checkhexdata(keystr,readkeybuf);
    393. if(keylen<0){
    394. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件只读密码!");
    395. ui->lineEdit_readkey->setFocus();
    396. return;
    397. }
    398. readkeylen[0]=keylen;
    399. keystr = ui->lineEdit_rwkey->text().trimmed();
    400. keylen=checkhexdata(keystr,rwkeybuf);
    401. if(keylen<0){
    402. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件读写密码!");
    403. ui->lineEdit_rwkey->setFocus();
    404. return;
    405. }
    406. rwkeylen[0]=keylen;
    407. spacesize=ui->spinBox_2->value();
    408. if (mycpursfileadd_s != NULL){ //是否成功连接上 cpursfileadd_s()函数
    409. status = mycpursfileadd_s(fileno,readkeybuf,readkeylen,rwkeybuf,rwkeylen,spacesize);
    410. if(status==0 ){
    411. mypcdbeep(30);
    412. QMessageBox::information(NULL, "提示", "CPU卡创建易写文件成功,需要使用易写函数写入文件数据!");
    413. }
    414. else
    415. {
    416. disperrinf(status);
    417. }
    418. }else{
    419. QMessageBox::critical(NULL, "提示", "函数‘cpursfileadd_s’未正确载入,请查询DLL文件版本是否正确!");
    420. }
    421. }
    422. void MainWindow::on_pb_addfile_clicked()
    423. {
    424. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    425. unsigned char status; //函数返回状态
    426. unsigned char fileno; //文件号
    427. unsigned char readkeylen[1]; //只读密钥长度
    428. unsigned char readkeybuf[20]; //只读密钥
    429. unsigned char rwkeylen[1]; //读写密钥长度
    430. unsigned char rwkeybuf[20]; //读写密钥
    431. int keylen;
    432. int spacesize; //空间大小
    433. QString keystr;
    434. fileno=ui->comboBox_addfile->currentIndex(); //新增加的文件号
    435. keystr = ui->lineEdit_readkey->text().trimmed();
    436. keylen=checkhexdata(keystr,readkeybuf);
    437. if(keylen<0){
    438. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件只读密码!");
    439. ui->lineEdit_readkey->setFocus();
    440. return;
    441. }
    442. readkeylen[0]=keylen;
    443. keystr = ui->lineEdit_rwkey->text().trimmed();
    444. keylen=checkhexdata(keystr,rwkeybuf);
    445. if(keylen<0){
    446. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件读写密码!");
    447. ui->lineEdit_rwkey->setFocus();
    448. return;
    449. }
    450. rwkeylen[0]=keylen;
    451. spacesize=ui->spinBox_2->value();
    452. if (mycpursfileadd != NULL){ //是否成功连接上 cpursfileadd()函数
    453. status = mycpursfileadd(fileno,readkeybuf,readkeylen,rwkeybuf,rwkeylen,spacesize);
    454. if(status==0 ){
    455. mypcdbeep(30);
    456. QMessageBox::information(NULL, "提示", "CPU卡创建标准文件成功,需使用写标准文件函数写入数据!");
    457. }
    458. else
    459. {
    460. disperrinf(status);
    461. }
    462. }else{
    463. QMessageBox::critical(NULL, "提示", "函数‘cpursfileadd’未正确载入,请查询DLL文件版本是否正确!");
    464. }
    465. }
    466. void MainWindow::on_pb_changkey_clicked()
    467. {
    468. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    469. unsigned char status; //函数返回状态
    470. unsigned char fileno; //文件号
    471. unsigned char ctrlword; //控制字
    472. unsigned char oldkeylen[1]; //旧密钥长度
    473. unsigned char oldkeybuf[20]; //旧密钥
    474. unsigned char newkeylen[1]; //新密钥长度
    475. unsigned char newkeybuf[20]; //新密钥
    476. int keylen;
    477. QString keystr;
    478. fileno=ui->comboBox_changekeyfile->currentIndex(); //要更改密钥的文件号
    479. if(ui->comboBox_changekey->currentIndex()==0){
    480. ctrlword=NEWKEYR; //更改只读密码
    481. }else{ctrlword=NEWKEYWR;} //更改读写密码
    482. if(ui->comboBox_authkey->currentIndex()==0){
    483. ctrlword=ctrlword+OLDKEYR; //用只读密码来认证
    484. }else{ctrlword=ctrlword+OLDKEYWR;} //用读写密码来认证
    485. keystr = ui->lineEdit_authkey->text().trimmed();
    486. keylen=checkhexdata(keystr,oldkeybuf);
    487. if(keylen<0){
    488. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件认证密码!");
    489. ui->lineEdit_authkey->setFocus();
    490. return;
    491. }
    492. oldkeylen[0]=keylen;
    493. keystr = ui->lineEdit_newkey->text().trimmed();
    494. keylen=checkhexdata(keystr,newkeybuf);
    495. if(keylen<0){
    496. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件新密码!");
    497. ui->lineEdit_newkey->setFocus();
    498. return;
    499. }
    500. newkeylen[0]=keylen;
    501. if (mycpursfilekeychg != NULL){ //是否成功连接上 cpursfilekeychg()函数
    502. status = mycpursfilekeychg(fileno,ctrlword,oldkeybuf,oldkeylen,newkeybuf,newkeylen);
    503. if(status==0 ){
    504. mypcdbeep(30);
    505. QMessageBox::information(NULL, "提示", "修改文件密码成功");
    506. }
    507. else
    508. {
    509. disperrinf(status);
    510. }
    511. }else{
    512. QMessageBox::critical(NULL, "提示", "函数‘cpursfilekeychg’未正确载入,请查询DLL文件版本是否正确!");
    513. }
    514. }
    515. void MainWindow::on_pb_read_clicked()
    516. {
    517. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    518. unsigned char status; //函数返回状态
    519. unsigned char fileno; //文件号
    520. unsigned char ctrlword; //控制字
    521. unsigned char oldkeylen[1]; //旧密钥长度
    522. unsigned char oldkeybuf[20]; //旧密钥
    523. int staradd; //读写起始地址
    524. int datalen; //读写长度
    525. unsigned char rwbuf[8000]; //读写数据缓冲
    526. int keylen;
    527. QString keystr;
    528. fileno=ui->comboBox_rwfile->currentIndex(); //要读写的文件号
    529. staradd=ui->spinBox_rwbegin->value(); //读写起始地址
    530. datalen=ui->spinBox_rwlen->value(); //读写数据长度
    531. if(datalen<1 || datalen>255){
    532. QMessageBox::critical(NULL, "提示", "每次读卡最多255字节,请输入正确的读卡长度!");
    533. ui->spinBox_rwlen->setFocus();
    534. return;
    535. }
    536. if(ui->comboBox_authrwkey->currentIndex()==0){
    537. ctrlword=OLDKEYR; //用只读密码来认证
    538. }else{ctrlword=OLDKEYWR;} //用读写密码来认证
    539. keystr = ui->lineEdit_authkey2->text().trimmed();
    540. keylen=checkhexdata(keystr,oldkeybuf);
    541. if(keylen<0){
    542. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件认证密码!");
    543. ui->lineEdit_authkey2->setFocus();
    544. return;
    545. }
    546. oldkeylen[0]=keylen;
    547. if (mycpursfiledataread != NULL){ //是否成功连接上 cpursfiledataread()函数
    548. status = mycpursfiledataread(fileno,ctrlword,oldkeybuf,oldkeylen,staradd,rwbuf,datalen);
    549. if(status==0 ){
    550. mypcdbeep(30);
    551. QString datastr="";
    552. for(int i=0;i
    553. datastr=datastr+QString::asprintf("%02X ", rwbuf[i]);
    554. }
    555. ui->plainTextEdit->setPlainText(datastr);
    556. QMessageBox::information(NULL, "提示", "读取数据成功!");
    557. }
    558. else
    559. {
    560. disperrinf(status);
    561. }
    562. }else{
    563. QMessageBox::critical(NULL, "提示", "函数‘cpursfiledataread’未正确载入,请查询DLL文件版本是否正确!");
    564. }
    565. }
    566. void MainWindow::on_pb_write_clicked()
    567. {
    568. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    569. unsigned char status; //函数返回状态
    570. unsigned char fileno; //文件号
    571. unsigned char ctrlword; //控制字
    572. unsigned char oldkeylen[1]; //旧密钥长度
    573. unsigned char oldkeybuf[20]; //旧密钥
    574. int staradd; //读写起始地址
    575. int datalen; //读写长度
    576. unsigned char rwbuf[8000]; //读写数据缓冲
    577. int keylen;
    578. QString keystr;
    579. QString datastr;
    580. keystr = ui->lineEdit_authkey2->text().trimmed();
    581. keylen=checkhexdata(keystr,oldkeybuf);
    582. if(keylen<0){
    583. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件认证密码!");
    584. ui->lineEdit_authkey2->setFocus();
    585. return;
    586. }
    587. oldkeylen[0]=keylen;
    588. datastr = ui->plainTextEdit->toPlainText().trimmed();
    589. datalen=checkhexdata(datastr,rwbuf);
    590. if(datalen<0){
    591. QMessageBox::critical(NULL, "提示", "请输入正确的16进制写入数据!");
    592. ui->plainTextEdit->setFocus();
    593. return;
    594. }
    595. fileno=ui->comboBox_rwfile->currentIndex(); //要读写的文件号
    596. staradd=ui->spinBox_rwbegin->value(); //读写起始地址
    597. datalen=ui->spinBox_rwlen->value(); //读写数据长度
    598. if(datalen<1 || datalen>247){
    599. QMessageBox::critical(NULL, "提示", "每次写卡最多247字节,请输入正确的写卡长度!");
    600. ui->spinBox_rwlen->setFocus();
    601. return;
    602. }
    603. if(ui->comboBox_authrwkey->currentIndex()==0){
    604. ctrlword=OLDKEYR; //用只读密码来认证
    605. }else{ctrlword=OLDKEYWR;} //用读写密码来认证
    606. if (mycpursfiledatawrite != NULL){ //是否成功连接上 cpursfiledatawrite()函数
    607. status = mycpursfiledatawrite(fileno,ctrlword,oldkeybuf,oldkeylen,staradd,rwbuf,datalen);
    608. if(status==0 ){
    609. mypcdbeep(30);
    610. QMessageBox::information(NULL, "提示", "写入数据成功!");
    611. }
    612. else
    613. {
    614. disperrinf(status);
    615. }
    616. }else{
    617. QMessageBox::critical(NULL, "提示", "函数‘cpursfiledatawrite’未正确载入,请查询DLL文件版本是否正确!");
    618. }
    619. }
    620. void MainWindow::on_pb_easy_write_clicked()
    621. {
    622. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    623. unsigned char status; //函数返回状态
    624. unsigned char fileno; //文件号
    625. unsigned char ctrlword; //控制字
    626. unsigned char oldkeylen[1]; //旧密钥长度
    627. unsigned char oldkeybuf[20]; //旧密钥
    628. int staradd; //读写起始地址
    629. int datalen; //读写长度
    630. unsigned char rwbuf[8000]; //读写数据缓冲
    631. int keylen;
    632. QString keystr;
    633. QString datastr;
    634. keystr = ui->lineEdit_authkey2->text().trimmed();
    635. keylen=checkhexdata(keystr,oldkeybuf);
    636. if(keylen<0){
    637. QMessageBox::critical(NULL, "提示", "请输入正确的16进制文件认证密码!");
    638. ui->lineEdit_authkey2->setFocus();
    639. return;
    640. }
    641. oldkeylen[0]=keylen;
    642. datastr = ui->plainTextEdit->toPlainText().trimmed();
    643. datalen=checkhexdata(datastr,rwbuf);
    644. if(datalen<0){
    645. QMessageBox::critical(NULL, "提示", "请输入正确的16进制写入数据!");
    646. ui->plainTextEdit->setFocus();
    647. return;
    648. }
    649. fileno=ui->comboBox_rwfile->currentIndex(); //要读写的文件号
    650. staradd=ui->spinBox_rwbegin->value(); //读写起始地址
    651. datalen=ui->spinBox_rwlen->value(); //读写数据长度
    652. if(ui->comboBox_authrwkey->currentIndex()==0){
    653. ctrlword=OLDKEYR; //用只读密码来认证
    654. }else{ctrlword=OLDKEYWR;} //用读写密码来认证
    655. if (mycpursfiledatawrite_s != NULL){ //是否成功连接上 cpursfiledatawrite_s()函数
    656. status = mycpursfiledatawrite_s(fileno,ctrlword,oldkeybuf,oldkeylen,staradd,rwbuf,datalen);
    657. if(status==0 ){
    658. mypcdbeep(30);
    659. QMessageBox::information(NULL, "提示", "写入数据成功!");
    660. }
    661. else
    662. {
    663. disperrinf(status);
    664. }
    665. }else{
    666. QMessageBox::critical(NULL, "提示", "函数‘cpursfiledatawrite_s’未正确载入,请查询DLL文件版本是否正确!");
    667. }
    668. }
    669. void MainWindow::on_pb_clear_clicked()
    670. {
    671. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    672. unsigned char status;
    673. if (mycpurscardclr != NULL){ //是否成功连接上 cpurscardclr()函数
    674. status = mycpurscardclr();
    675. if(status==0){
    676. mypcdbeep(30);
    677. QMessageBox::information(NULL, "提示", "cpu卡强制清空卡成功");
    678. }else{
    679. if(status==64){
    680. QMessageBox::information(NULL, "提示", "此卡为未经过我们cpursinit函数成功初始化的卡");
    681. }else{
    682. disperrinf(status);
    683. }
    684. }
    685. } else{
    686. QMessageBox::critical(NULL, "提示", "函数‘cpurscardclr’未正确载入,请查询DLL文件版本是否正确!");
    687. }
    688. }
    689. void MainWindow::on_pb_changecardkey_clicked()
    690. {
    691. if(!checkdllos()){return;} //判断运行目录内动态库文件是否存在
    692. unsigned char status; //函数返回状态
    693. unsigned char oldkeylen[1]; //旧密钥长度
    694. unsigned char oldkeybuf[20]; //旧密钥
    695. unsigned char newkeylen[1]; //新密钥长度
    696. unsigned char newkeybuf[20]; //新密钥
    697. int keylen;
    698. QString keystr;
    699. keystr = ui->lineEdit_cardoldkey->text().trimmed();
    700. keylen=checkhexdata(keystr,oldkeybuf);
    701. if(keylen<0){
    702. QMessageBox::critical(NULL, "提示", "请输入正确的16进制卡旧密码!");
    703. ui->lineEdit_cardoldkey->setFocus();
    704. return;
    705. }
    706. oldkeylen[0]=keylen;
    707. keystr = ui->lineEdit_cardnewkey->text().trimmed();
    708. keylen=checkhexdata(keystr,newkeybuf);
    709. if(keylen<0){
    710. QMessageBox::critical(NULL, "提示", "请输入正确的16进制卡新密码!");
    711. ui->lineEdit_cardnewkey->setFocus();
    712. return;
    713. }
    714. newkeylen[0]=keylen;
    715. if (mycpurscardkeychg != NULL){ //是否成功连接上 cpurscardkeychg()函数
    716. status = mycpurscardkeychg(oldkeybuf,oldkeylen,newkeybuf,newkeylen);
    717. if(status==0 ){
    718. mypcdbeep(30);
    719. QMessageBox::information(NULL, "提示", "修改卡片密码成功");
    720. }
    721. else
    722. {
    723. disperrinf(status);
    724. }
    725. }else{
    726. QMessageBox::critical(NULL, "提示", "函数‘cpurscardkeychg’未正确载入,请查询DLL文件版本是否正确!");
    727. }
    728. }

  • 相关阅读:
    传奇服务端服务端运行7个窗口的各窗口功能讲解
    2016 ZCTF note3:一种新解法
    计算机毕设(附源码)JAVA-SSM基于的装修公司运营管理管理系统
    LCR 120.寻找文件副本
    【译】使用 GitHub Copilot 作为你的编码 GPS
    P2P应用
    zookeeper、Dubbo
    Word处理控件Aspose.Words功能演示:在 Python 中比较两个 Word 文档
    这就是程序员眼中的函数吗?(一)
    Python Opencv实践 - 视频文件操作
  • 原文地址:https://blog.csdn.net/zhangjin7422/article/details/133745913