本文由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