QT读取身份证信息

QT读取身份证信息

使用的是华视的读卡器,先去官网(http://www.chinaidcard.com/)下载读卡二次开发SDK,里边有二次开发的说明文档和示例,复制termb.dll 、sdtapi.dll、WltRs.dll等到程序路径下。使用 QLibrary 从 termb.dll 加载身份证读取相关的函数。
代码:
.h

#ifndef BP_READCARD_H
#define BP_READCARD_H

#include <QObject>
#include <QLibrary>
#include <QDebug>

typedef int __stdcall (*CVR_InitComm)(int);                  //初始化
typedef int __stdcall (*CVR_Authenticate)();                  //卡认证
typedef int __stdcall (*CVR_Read_FPContent)();                //读卡
typedef int __stdcall (*CVR_GetPeopleName)(char *,int &);    //获取姓名
typedef int __stdcall (*CVR_GetPeopleIDCode)(char *,int &);  //获取身份证号
typedef int __stdcall (*CVR_CloseComm)();                    //关闭链接

//身份证信息
struct stu_card_info
{
    QString name;
    QString ID;
};

class ReadCard:public QObject
{
    Q_OBJECT
public:
    ReadCard();
    ~ReadCard();
    bool init_cvr();
private:
    bool read_card_info();
    bool load_function();
signals:
    void read_finished(stu_card_info info);
    void read_error();
private slots:
    void read_card();
private:
    //身份证读取函数指针
    CVR_InitComm        func_cvr_InitComm      {nullptr};
    CVR_Authenticate    func_cvr_Authenticate  {nullptr};
    CVR_Read_FPContent  func_cvr_Read_FPContent {nullptr};
    CVR_GetPeopleName    func_cvr_GetPeopleName  {nullptr};
    CVR_GetPeopleIDCode  func_cvr_GetPeopleIDCode{nullptr};
    CVR_CloseComm        func_cvr_CloseComm      {nullptr};
    //读取身份证的缓冲区
    char                m_buf[40];
    int                  m_buf_size = 40;
    stu_card_info        m_info;
};
#endif // BP_READCARD_H

.cpp

#include "bp_readcard.h"
#include <QFile>

ReadCard::ReadCard()
{

}

ReadCard::~ReadCard()
{
    if(func_cvr_CloseComm)
        func_cvr_CloseComm();
}
//加载dll中的函数指针
bool ReadCard::load_function()
{
    func_cvr_InitComm      = {nullptr};
    func_cvr_Authenticate  = {nullptr};
    func_cvr_Read_FPContent = {nullptr};
    func_cvr_GetPeopleName  = {nullptr};
    func_cvr_GetPeopleIDCode= {nullptr};
    func_cvr_CloseComm      = {nullptr};
    qRegisterMetaType<stu_card_info>("stu_card_info");
    QLibrary lib("termb.dll");
    if(lib.load())                      //加载身份证读取库中的函数
    {
        func_cvr_InitComm = (CVR_InitComm)lib.resolve("CVR_InitComm");
        if(!func_cvr_InitComm)
            qDebug()<<"CVR_InitComm 解析失败"<<lib.errorString();
        func_cvr_GetPeopleName = (CVR_GetPeopleName)lib.resolve("GetPeopleName");
        if(!func_cvr_GetPeopleName)
            qDebug()<<"CVR_GetPeopleName 解析失败"<<lib.errorString();
        func_cvr_GetPeopleIDCode = (CVR_GetPeopleIDCode)lib.resolve("GetPeopleIDCode");
        if(!func_cvr_GetPeopleIDCode)
            qDebug()<<"CVR_GetPeopleIDCode 解析失败"<<lib.errorString();
        func_cvr_Authenticate = (CVR_Authenticate)lib.resolve("CVR_Authenticate");
        if(!func_cvr_Authenticate)
            qDebug()<<"CVR_Authenticate 解析失败"<<lib.errorString();
        func_cvr_Read_FPContent = (CVR_Read_FPContent)lib.resolve("CVR_Read_FPContent");
        if(!func_cvr_Read_FPContent)
            qDebug()<<"CVR_Read_FPContent 解析失败"<<lib.errorString();
        func_cvr_CloseComm = (CVR_CloseComm)lib.resolve("CVR_CloseComm");
        if(!func_cvr_CloseComm)
            qDebug()<<"CVR_CloseComm 解析失败"<<lib.errorString();
    }
    else
      qDebug()<<"termb.dll load faild."<<lib.errorString();
    return (func_cvr_InitComm && func_cvr_Authenticate && func_cvr_Read_FPContent && func_cvr_GetPeopleName && func_cvr_GetPeopleIDCode && func_cvr_CloseComm);
}

//初始化
bool ReadCard::init_cvr()
{
    if(!load_function())    //加载函数失败
        return false;
    int iPort, iRetUSB = 0, iRetCOM = 0;
    for (iPort = 1001; iPort <= 1004; iPort++)  //USB
    {
        iRetUSB = func_cvr_InitComm(iPort);
        if (iRetUSB == 1)
            break;
    }
    if (iRetUSB != 1)
    {
        for (iPort = 1; iPort <= 4; iPort++)    //port
        {
            iRetCOM = func_cvr_InitComm(iPort);
            if (iRetCOM == 1)
                break;
        }
    }
    if ((iRetCOM == 1) || (iRetUSB == 1))
        return true;
    return false;
}
//读卡姓名身份证号
bool ReadCard::read_card_info()
{
    if(func_cvr_Read_FPContent() == 1)
    {
        memset(m_buf,0,m_buf_size);
        if(1 == func_cvr_GetPeopleName(m_buf,m_buf_size))
        {
            m_info.name = QString::fromLocal8Bit(m_buf);
            memset(m_buf,0,m_buf_size);
            if(1 == func_cvr_GetPeopleIDCode(m_buf,m_buf_size))
            {
                m_info.ID = m_buf;
                emit read_finished(m_info);
                //删除读取身份证生成的文件
                QFile::remove("wz.txt");
                QFile::remove("fp.dat");
                QFile::remove("zp.bmp");
                return true;
            }
        }
    }
    emit read_error();
    return false;
}
//读卡,尝试读,读失败尝试认证,认证成功再读一次
void ReadCard::read_card()
{
    if(!read_card_info())
    {
        if(1 == func_cvr_Authenticate())
        {
            read_card_info();
        }
    }
}

使用时,调用 init_cvr 初始化成功后调用 read_card 读取身份证信息,然后接收读取完成的信号即可。读卡耗时比较久大概会有几百毫秒。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中实现身份证合法性校验通常涉及到中国居民身份证号码的验证规则,这些规则包括数字位数、校验码计算等。由于这种校验涉及到正则表达式和特定算法,我们可以利用Qt的QRegExp或自定义函数来完成。 以下是一个简单的步骤概述: 1. **包含必要的库**:首先,在Qt项目中引入所需的正则表达式库(如`<regex>`)。 2. **定义身份证号的正则表达式**:创建一个正则表达式来匹配中国大陆的18位或15位身份证号。例如: ```cpp QRegExp idCardPattern("(\\d{6})(1[89]|20)?(\\d{4})(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])([0-9Xx]{1})"); ``` 3. **校验方法**:编写一个函数来检查输入的字符串是否匹配该模式,并执行校验码的计算。对于18位身份证,计算第17位校验码;对于15位身份证,不计算最后一位。 ```cpp bool isValidIDCard(QString id) { if (!idCardPattern.exactMatch(id)) return false; // 初步校验长度 // 根据身份证的结构计算校验码,这里仅示例18位身份证的计算 int sum = 0; for (int i = 0; i < 17; ++i) { sum += (i % 2 == 0) ? id[i] - '0' * 2 : id[i] - '0'; } int checkCode = (sum % 11 > 1) ? 11 - sum % 11 : sum % 11; return checkCode == id[id.size() - 1].toInt(); // 检查最终校验码是否一致 } ``` 4. **调用校验函数**:在用户输入身份证号码后,使用`isValidIDCard`函数验证其有效性。 记得这只是一个基础的示例,实际应用可能需要处理更复杂的边界情况,比如出生日期的有效性等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值