从字符数组中获取子串(Get a substring of a char*)

本文由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汉字
出生日期9YYYYMMDD
住址71汉字和数字
公民身份号码19数字和字母
签发机关31汉字
有效期起始日期9YYYYMMDD
有效期起始日期19YYYYMMDD,有效期为长期的表示为汉字”长期”

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值