关于二代身份证读卡器的二次开发

cnmghi 2008-05-12 01:56:49
客户提供一台读卡器、sdtapi.dll、WltRS.dll,以及相应的头文件,我是通过java的jni与所写c++代码进行交互,但是java这边接收到的身份证基本信息一直是乱码。先说明c++向java传其他中文不会出现乱码,是在c++读出的身份证信息就是乱码。c++的代码如下:
#include "windows.h"
#include "CardReader.h"
#include "sdtapi.h"
#include "String.h"
#include "WltRS.h"


JNIEXPORT jbyteArray JNICALL Java_CardReader_getMessage(JNIEnv * env, jobject jobj){

char* szStr="mei zhao dao xin xi";
char cInput;
int iRet; //返回码
int iPort; //端口号
int iIfOpen=0; //是否需要打开串口
unsigned char pucIIN[8];
unsigned char pucSN[8];
unsigned char pucCHMsg[512]; //文字信息
unsigned char pucPHMsg[1024]; //照片信息
unsigned char pucFPMsg[1024]; //指纹信息
unsigned int uiCHMsgLen,uiPHMsgLen;

memset(pucCHMsg,0,sizeof(pucCHMsg));
int length;
jbyteArray RtnArr = NULL;
jsize arrsize;

if(iIfOpen==0){

for (iPort = 1001; iPort <= 1016; iPort++)
{
iRet=SDT_OpenPort(iPort);
printf("SDT_OpenPort usb error, error code is: %02x\n", iRet);
printf("SDT_OpenPort usb error, error code is: %02d\n", iPort);
if(iRet==0x90) break;
}


if(iRet!=0x90)
{

printf("SDT_OpenPort error, error code is: %02x\n", iRet);
SDT_ClosePort(iPort);
szStr="SDT_OpenPort error";
printf(szStr);
length = strlen(szStr);
arrsize =(jsize)length;

RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);

return RtnArr;

}

iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen);
printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);
if (iRet != 0x9f)
{
iRet=SDT_StartFindIDCard(iPort,pucIIN, iIfOpen); //再找卡
if (iRet != 0x9f)
{
iRet = SDT_ClosePort(iPort);
printf("SDT_StartFindIDCard error, error code is: %02x\n", iRet);
szStr="SDT_StartFindIDCard error";
length = strlen(szStr);
arrsize =(jsize)length;

RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);

return RtnArr;
}
}

iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen);
printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);
if (iRet != 0x90)
{
iRet=SDT_SelectIDCard (iPort,pucSN, iIfOpen); //再选卡
if (iRet != 0x90)
{
iRet = SDT_ClosePort(iPort);
printf("SDT_SelectIDCard error, error code is: %02x\n", iRet);
szStr="SDT_SelectIDCard error";
length = strlen(szStr);
arrsize =(jsize)length;

RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);

return RtnArr;
}
}


iRet=SDT_ReadBaseMsg(iPort,pucCHMsg,&uiCHMsgLen, pucPHMsg,&uiPHMsgLen, iIfOpen);
printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);

if(iRet!=0x90)
{
printf("SDT_ReadBaseMsg error, error code is: %02x\n", iRet);
if(iIfOpen==0)
SDT_ClosePort(iPort);
printf("ssaaaasasasaas\n");
szStr="SDT_ReadBaseMsg error";
length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
printf("123345453\n");
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);
printf("12sssssssss33454534ssaaaasasasaas");
return RtnArr;
}
printf("SDT_ReadBaseMsg OK\n");
if(iIfOpen==0)
SDT_ClosePort(iPort);

RtnArr=env->NewByteArray(uiCHMsgLen);
printf("pucCHMsg=%s\n",pucCHMsg);
env->SetByteArrayRegion(RtnArr, 0,uiCHMsgLen, (jbyte*)pucCHMsg);

return RtnArr;
}

length = strlen(szStr);
arrsize =(jsize)length;
RtnArr=env->NewByteArray(arrsize);
env->SetByteArrayRegion(RtnArr, 0,length, (jbyte*)szStr);

return RtnArr;

}
...全文
1110 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ85743282 2011-05-14
  • 打赏
  • 举报
回复
我有一个身份证真假验证的接口数据来源是公安部,可以根据名字和证号得到头像,如果需要可找我QQ85743282
tayirvb 2011-03-21
  • 打赏
  • 举报
回复
怎么写 VB.Net ?
Seattle2006 2008-05-14
  • 打赏
  • 举报
回复
学习一下!
用户 昵称 2008-05-14
  • 打赏
  • 举报
回复
改正一下

char *
unicode2s( unsigned char *buf, unsigned short length, char *tmpbuf )
{
int i;
char *p;
char s[ 10 ] = "";
wchar_t wstr[ 1 ];
CString mstr;
int l, curlen;

*tmpbuf = 0;
curlen = 0;
mstr = _T( "" );

for( i = 0; i < ( int )length; i += 2 )
{
p = ( char * )wstr;
*p = *( buf ); //high
*( p + 1 ) = *( buf + 1 ); //low
mstr = wstr;
memset( s, 0, sizeof( s ) );
strcat( s, ( const char * )mstr );
if( *( buf + 1 ) ) //if low is not 0
{
s[ 2 ] = 0;
l = 2;
}
else
{
s[ 1 ] = 0;
l = 1;
}

strcat( tmpbuf + curlen, ( const char * )s );
curlen += l;

buf += 2;
}

return tmpbuf;
}
用户 昵称 2008-05-14
  • 打赏
  • 举报
回复
用这个函数

弝鷁w弝轢^焲i:S錧N飴5 2 3 鱏o忲Nf[b? 5 NGS,go忲N錧 z

这段乱码在内存中存放的实际是

0x8F, 0x79, 0xFA, 0x5E, 0x01, 0x77, 0x8F, 0x79, 0xDE, 0x5D, 0x02, 0x5E, 0x13, 0x9F, 0x7C, 0x69, 0x3A, 0x53, 0xE5, 0x5D

调用unicode2s( 前面那段乱码, 乱码的长度, gb3212代码的缓冲指针,预先清成全0 );

char *
unicode2s( unsigned char *buf, unsigned short length, char *tmpbuf )
{
int i;
char *p;
char s[ 100 ] = "";
wchar_t wstr[ 1 ];
CString mstr;

*tmpbuf = 0;
mstr = _T( "" );

for( i = 0; i < ( int )length; i += 2 )
{
p = ( char * )wstr;
*p = *( buf ); //high
*( p + 1 ) = *( buf + 1 ); //low
mstr = wstr;
memset( s, 0, sizeof( s ) );
strcat( s, ( const char * )mstr );
if( *buf ) //if low is not 0
{
s[ 2 ] = 0;
}
else
{
s[ 1 ] = 0;
}

strcat( tmpbuf, ( const char * )s );

buf += 2;
}

return tmpbuf;
}
用户 昵称 2008-05-14
  • 打赏
  • 举报
回复
你取出来的

弝鷁w弝轢^焲i:S錧N飴5 2 3 鱏o忲Nf[b? 5 NGS,go忲N錧 z

就是unicode格式的了,所以只要用WideChaiToMultiByte转一下就会变成gb2312的了。

这明明是C程序,怎么会写到vb版呢?
cnmghi 2008-05-14
  • 打赏
  • 举报
回复
回jennyvenus:老大,你挺牛的,呵呵。但是怎么取unicode的高位和低位?
goingup 2008-05-13
  • 打赏
  • 举报
回复
关注
用户 昵称 2008-05-13
  • 打赏
  • 举报
回复
福州市公安局XX分局

.........

这是楼主自己吗?

先将乱码部分两个字节一组取出值来,然后用 chrw( unicode 高位 * 256 + unicode低位 )。
用户 昵称 2008-05-13
  • 打赏
  • 举报
回复
福建省福州市鼓楼区工.........

这就是信息内容,可以肯定,里面的内容是unicode的,至于unicode如何转成gb2312显示到屏幕上,网上有的是代码了。
cnmghi 2008-05-13
  • 打赏
  • 举报
回复
我不知道信息的格式。我觉得可能是编码的问题
乱码的信息如下:
H?f墢 1 0 1 1 9 8 3 0 3 0 5 弝鷁w弝轢^焲i:S錧N飴5 2 3 鱏o忲Nf[b? 5 NGS,go忲N錧z 3 5 0 5 0 2 1 9 8 3 0 3 0 5 3 2 1 2 弝轢^lQ塠@\焲iR@\ 2 0 0 6 0 4 1 3 2 0 1 6 0 4 1 3
用户 昵称 2008-05-12
  • 打赏
  • 举报
回复
你知道信息的格式吗?是否经过加密?
cnmghi 2008-05-12
  • 打赏
  • 举报
回复
scq2099yt,我是用这个函数去读身份证的信息,基本信息存在pucCHMsg,照片信息存在pucPHMsg
iRet=SDT_ReadBaseMsg(iPort,pucCHMsg,&uiCHMsgLen, pucPHMsg,&uiPHMsgLen, iIfOpen);
但是我用printf("pucCHMsg=%s\n",pucCHMsg);
打出身份证的基本信息是乱码
用户 昵称 2008-05-12
  • 打赏
  • 举报
回复
先透过java,直接用c调用相关的函数。
scq2099yt 2008-05-12
  • 打赏
  • 举报
回复
确保数据格式无误,建议用字符串

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧