本文由Markdown语法编辑器编辑完成。

1. 问题提出:

目前正在做业务系统与一款身份证读卡器的系统集成。该款身份证读卡设备, 可以从放置在读卡区域的身份证中读取到身份证的基本信息,包括: 姓名, 性别, 民族, 出生年月日, 身份证号码, 户籍地, 以及身份证的签发机构, 而且可以读取到身份证的有效期等有效信息.

该身份证读卡器厂商提供了二次开发的集成文档。提供了一个头文件,以及所依赖的动态链接库文件。

根据该厂商提供的demo,通过调用它提供的一个函数,可以得到一个字符数组,这个数字的长度为192,里面包含了这个身份证中的所有信息,包括姓名,性别,出生日期等等。

具体的demo示例如下:

#include "sdtapi.h"
int main() 
{
    int ret;
    int iPort = 1;

    ret = InitComm(iPort);
    if(ret) {
        ret = Authenticate();
        if(ret) {
            char Msg[200];
            ret = ReadBaseMsg(Msg,0);
            if(ret > 0) {
                //显示文字及图片信息.
            }
        }
    }
    ret = CloseComm();
    return ret;
}

如上面的这段程序,在第11行定义的字符数组 char Msg[200], 通过调用接口中提供的ReadBaseMsg(Msg,0)函数,所有的身份证信息,都包含在了这个数组中。
但是,为了能够分别显示这个数组中包含的信息,我需要从这个字符数组中根据起始位置和特定的长度,取出相应的字串,来显示。

函数原型:
int ReadBaseMsg(unsigned char *pMsg, int *len);
函数说明:
本函数用于读取卡中基本信息,包含文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图像信息被解码后存为文件photo.bmp.

每一个子串的起始位置和子串长度如下所示:

项目

长度(字节)

说明

姓名

31

汉字

性别

3

汉字

民族

10

汉字

出生日期

9

YYYYMMDD

住址

71

汉字和数字

公民身份号码

19

数字和字母

签发机关

31

汉字

有效期起始日期

9

YYYYMMDD

有效期起始日期

19

YYYYMMDD,有效期为长期的表示为汉字”长期”

2. 问题解决:

Examples:

char *buff = “this is a test string”; 
 and want to get “test”.Solutions: 
 char subbuff[5]; 
 memcpy( subbuff, &buff[10], 4 ); 
 subbuff[4] = ‘\0’;

根据以上的例子,可以得出获取身份证子串的示例代码:

int main() {
    unsigned char BaseMsg[200];

    int ret;
    ret = ReadBaseMsg (BaseMsg, 0);
    if (1 == ret) {

        //姓名
        unsigned char ID_Name[32];
        memcpy(ID_Name, &BaseMsg[0], 31);
        ID_Name[31] = '\0';
        std::cout << "ID Name is:" << ID_Name << std::endl;

        //性别
        unsigned char ID_Sex[4];
        memcpy(ID_Sex, &BaseMsg[31], 3);
        ID_Sex[3] = '\0';
        std::cout << "ID Sex is:" << ID_Sex << std::endl;

        //民族
        unsigned char ID_Nation[11];
        memcpy(ID_Nation, &BaseMsg[34], 10);
        ID_Nation[10] = '\0';
        std::cout << "ID Nation is:" << ID_Nation << std::endl;

        //出生日期
        unsigned char ID_Birthday[10];
        memcpy(ID_Birthday, &BaseMsg[44], 9);
        ID_Birthday[9] = '\0';
        std::cout << "ID Birthday is:" << ID_Birthday << std::endl;

        //住址
        unsigned char ID_Address[72];
        memcpy(ID_Address, &BaseMsg[53], 71);
        ID_Address[71] = '\0';
        std::cout << "ID Address is:" << ID_Address<< std::endl;


        //公民身份证号码
        unsigned char ID_CardNo[20];
        memcpy(ID_CardNo, &BaseMsg[124], 19);
        ID_CardNo[19] = '\0';
        std::cout << "ID CardNo is:" << ID_CardNo<< std::endl;
    }
    return 1;
}

最后得到的输出信息为:
……

未完待续……

参考链接:
https://stackoverflow.com/questions/4214314/get-a-substring-of-a-char