《C#读取二代身份证信息源码.pdf》由会员分享,可在线阅读,更多相关《C#读取二代身份证信息源码.pdf(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C#读取二代身份证信息源码using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection;using System.IO;namespace ICCard(public class clsICCard(首先,声明通用接口DlllmportCsdtapi.dir)public static extern int S
2、DT_OpenPort(int iPortID);DlllmportCsdtapi.dir)public static extern int SDT_ClosePort(int iPortID);DlllmportCsdtapi.dir)public static extern int SDT_PowerManagerBegin(int iPortID,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_AddSAMUser(int iPortID,string pclIserName,int ilfOpen);Dlll
3、mportCsdtapi.dir)public static extern int SDT_SAMLogin(int iPortID,string pcUserName,string pcPasswd,int ilfOpen);Dlllmport(*sdtapi.dir)public static extern int SDT_SAMLogout(int iPortID,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_UserManagerOK(int iPortID,int ilfOpen);DlllmportCs
4、dtapi.dir)public static extern int SDT_ChangeOwnPwd(int iPortID,string pcOldPasswd,string pcNewPasswd,intilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_ChangeOtherPwd(int iPortID,string pcUserName,string pcNewPasswd,intilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_DeleteSAMU
5、ser(int iPortID,string pcUserName,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_StartFindIDCard(int iPortID,ref int pucllN,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_SelectlDCard(int iPortID,ref int pucSN,int ilfOpen);Dlllmport(sdtapi.dir)public static extern int
6、 SDT_ReadBaseMsg(int iPortID,string pucCHMsg,ref int puiCHMsgLen,stringpucPHMsg,ref int puiPHMsgLen,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_ReadBaseMsgToFile(int iPortID,string fileNamel,ref int puiCHMsgLen,string fileName2,ref int puiPHMsgLen,int ilfOpen);DlllmportCsdtapi.dir
7、)public static extern int SDT_WriteAppMsg(int iPortID,ref byte pucSendData,int uiSendLen,ref bytepucRecvData,ref int puiRecvLen,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_WriteAppMsgOK(int iPortID,ref byte pucData,int uiLen,int ilfOpen);DlllmportCsdtapi.dir)public static extern i
8、nt SDT_CancelWriteAppMsg(int iPortID,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_ReadNewAppMsg(int iPortID,ref byte pucAppMsg,ref int puiAppMsgLen,intilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_ReadAIIAppMsg(int iPortID,ref byte pucAppMsg,ref int puiAppMsgLen,intilf
9、Open);DlllmportCsdtapi.dir)public static extern int SDT_UsableAppMsg(int iPortID,ref byte ucByte,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_GetUnlockMsg(int iPortID,ref byte strMsg,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_GetSAMID(int iPortID,ref byte StrSAM
10、 ID,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_SetMaxRFByte(int iPortID,byte ucByte,int ilfOpen);DlllmportCsdtapi.dir)public static extern int SDT_ResetSAM(int iPortID,int i If Open);PDADlllmport(,WltRS.dll,)public static extern int GetBmp(string file_name,int intf);public delega
11、te void De_ReadlCCardComplete(clsEDZ objEDZ);public event De_ReadlCCardComplete Read ICCardComplete;private cIsEDZ objEDZ=new clsEDZ();private int EdzilfOpen=1;自动开关串 口int EdziPortID;public clslCCard()()public bool ReadlCCard()(bool bUsbPort=false;int intOpenPortRtn=0;int rtnTemp=0;int pucllN=0;int p
12、ucSN=0;int puiCHMsgLen=0;int puiPHMsgLen=0;objEDZ=new clsEDZ();检测usb 口的机具连接,必须先检测usbfor(int iPort=1001;iPort=1016;iPort+)intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn=144)EdziPortID=iPort;bUsbPort=true;break;)检测串口的机具连接if(IbUsbPort)(for(int iPort=1;iPort=2;iPort+)(intOpenPortRtn=SDT_OpenPort(i
13、Port);if(intOpenPortRtn=144)(EdziPortID=iPort;bUsbPort=false;break;)if(intOpenPortRtn!=144)MessageBox.ShowC端 口 打 开 失 败,请 检 测 相 应 的 端 口 或 者 重 新 连 接 读 卡 器!,提示MessageBoxButtons.OK,MessageBox Icon.Error);return false;)在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,您要考虑机具连接
14、端口被用户改变的情况哦下面找卡rtnTemp=SDT_StartFindlDCard(EdziPortlD,ref pucllN,EdzilfOpen);if(rtnTemp!=159)(rtnTemp=SDT_StartFindlDCard(EdziPortlD,ref pucllN,EdzilfOpen);再找卡if(rtnTemp!=159)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show。未放卡或者卡未放好,请重新放卡!,提示,MessageBoxButtons.OK,MessageBoxIcon.Error);return fals
15、e;)选卡rtnTemp=SDT_SelectlDCard(EdziPortlD,ref pucSN,EdzilfOpen);if(rtnTemp!=144)rtnTemp=SDT_SelectlDCard(EdziPortlD,ref pucSN,EdzilfOpen);再选卡if(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show(读卡失败!提示,MessageBoxButtons.OK,MessageBoxIcon.Error);return false;)注意,在这里,用户必须有应用程序当前目录的读写权限检测串
16、口的机具连接if(IbUsbPort)(for(int iPort=1;iPort=2;iPort+)(intOpenPortRtn=SDT_OpenPort(iPort);if(intOpenPortRtn=144)(EdziPortID=iPort;bllsbPort=false;break;)if(intOpenPortRtn!=144)(MessageBox.Show。端 口 打 开 失 败,请 检 测 相 应 的 端 口 或 者 重 新 连 接 读 卡 器!提示MessageBoxButtons.OK,MessageBoxIcon.Error);return false;)在这里,如
17、果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,您要考虑机具连接端口被用户改变的情况哦下面找卡rtnTemp=SDT_StartFindlDCard(EdziPortlD,ref pucllN,EdzilfOpen);身份证读卡器v/Aif(rtnTemp!=159)(rtnTemp=SDT_StartFindlDCard(EdziPortlD,ref pucllN,EdzilfOpen);再找卡if(rtnTemp!=159)(rtnTemp=SDT_ClosePort(EdziPortlD);
18、MessageBox.ShowC未放卡或者卡未放好,请 重 新 放 卡!提示,MessageBoxButtons.OK,MessageBox Icon.Error);return false;)选卡rtnTemp=SDT_SelectlDCard(EdziPortlD,ref pucSN,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDT_SelectlDCard(EdziPortlD,ref pucSN,EdzilfOpen);再选 kif(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Sh
19、ow(,读卡失败!,提示,MessageBoxButtons.OK,MessageBoxIcon.Error);return false;)注意,在这里,用户必须有应用程序当前目录的读写权限Fileinfo objFile=new Filelnfo(4wz.txtl);if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();)objFile=new Filelnfo(*zp.bmp,);if(objFile.Exists)objFile.Attributes=FileAttributes.Norm
20、al;objFile.Delete();)objFile=new Filelnfo(*zp.wlt);if(objFile.Exists)(objFile.Attributes=FileAttributes.Normal;objFile.Delete();)rtnTemp=SDT_ReadBaseMsgToFile(EdziPortlD,wz.txt*,ref puiCHMsgLen,zp.wlt4,ref puiPHMsgLen,EdzilfOpen);if(rtnTemp!=144)(rtnTemp=SDT_ClosePort(EdziPortlD);MessageBox.Show(读卡失
21、败!提示,MessageBoxButtons.OK,MessageBoxIcon.Error);return false;)下面解析照片,注意,如果在C盘根目录下没有机具厂商的授权文件Termb.Lic,照片解析将会失败if(bUsbPort)rtnTemp=GetBmp(*zp.wlt,2);elsertnTemp=GetBmp(lzp.wlt,1);switch(rtnTemp)case 0:MessageBox.ShowC调用 sdtapi.dll 错误!,提示,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case 1:正常break
22、;case-1:MessageBox.ShowC 相片解码错误!,提示,MessageBoxButtons.OK,MessageBox Icon.Error);break;case-2:MessageBox.Show(wlt 文件后缀错误!提示,MessageBoxButtons.OK,MessageBox Icon.Error);break;case-3:MessageBox.Show(wlt 文件打开错误!提示,MessageBoxButtons.OK,MessageBox Icon.Error);break;case-4:MessageBox.Show(wlt 文件格式错误!提示,Mes
23、sageBoxButtons.OK,MessageBox Icon.Error);break;case-5:MessageBox.Show(软件未授权!提示,MessageBoxButtons.OK,MessageBoxIcon.Error);break;case-6:MessageBox.Show,设备连接错误!提示l,MessageBoxButtons.OK,MessageBoxIcon.Error);break;)rtnTemp=SDT_ClosePort(EdziPortlD);File Info f=new Filelnfo(*wz.txt);FileStream fs=f.Open
24、Read();byte bt=new bytefs.Length;fs.Read(bt,0,(int)fs.Length);fs.Close();string str=System.Text.UnicodeEncoding.Unicode.GetString(bt);objEDZ.Name=System.Text.UnicodeEncoding.Unicode.GetString(bt,0,30).Trim();objEDZ.Sex_Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,30,2).Trim();objEDZ.NATION_
25、Code=System.Text.UnicodeEncoding.Unicode.GetString(bt,32,4).Trim();string strBird=System.Text.UnicodeEncoding.Unicode.GetString(bt,36,16).Trim();objEDZ.BIRTH=Convert.ToDateTime(strBird.Substring(0,4)+年+strBird.Substring(4,2)+月+strBird.Substring(6)+旧 );objEDZ.ADDRESS=System.Text.UnicodeEncoding.Unico
26、de.GetString(bt,52,70).Trim();objEDZ.I DC=System.Text.UnicodeEncoding.Unicode.GetString(bt,122,36).Trim();objEDZ.REGORG=System.Text.UnicodeEncoding.Unicode.GetString(bt,158,30).Trim();string strTem=System.Text.UnicodeEncoding.Unicode.GetString(bt,188,bt.GetLength(O)-188).Trim();objEDZ.STARTDATE=Conv
27、ert.ToDateTime(strTem.Substring(0,4)+年+strTem.Substring(4,2)+月,+strTem.Substring(6,2)+曰);strTem=strTem.Substring(8);if(strTem.Trim()!=长期)objEDZ.ENDDATE=Convert.ToDateTime(strTem.Substring(01 4)+年+strTem.Substring(4,2)+月,+strTem.Substring(6,2)+曰);)else(objEDZ.ENDDATE=DateTime.MaxValue;)objFile=new Fi
28、lelnfo(zp.bmp);if(objFile.Exists)(Image img=Image.FromFile(zp.bmp4);objEDZ.PIC_lmage=(lmage)img.Clone();System.10.Memorystream m=new MemoryStream();img.Save(m,System.Drawing.Imaging.ImageFormat.Jpeg);objEDZ.PIC_Byte=m.ToArray();img.Dispose();img=null;)ReadlCCardComplete(objEDZ);return true;)public c
29、lass cIsEDZ(private System.Collections.SortedList IstMZ=new SortedList();private string _Name;姓名private string _Sex_Code;性别代码private string _Sex_CName;性别private string _IDC;身份证号码private string _NATION_Code;民族代码private string _NATION_CName;民族private DateTime _BIRTH;出生日期private string _ADDRESS;住址priva
30、te string _REGORG;签发机关private DateTime _STARTDATE;身份证有效起始日期private DateTime _ENDDATE;身份证有效截至日期private string _Period_Of_Validity_Code;有效期限代码,许多原来系统上面为了一代证考虑,常常存在这样的字段,二代证中已经没有了private string _Period_Of_Validity_CName;有效期限private byte _PIC_Byte;照片二进制private Image _PIC_lmage;照片public clsEDZ()lstMZ.Add
31、(O1,汉族);lstMZ.Add(g 蒙古族Is tM Z.A d d g 回族lstMZ.Add(,04藏族力lstMZ.Add(g 维吾尔族);lstMZ.Add(P6苗族);lstMZ.AddC07*,lstMZ.Add(087 壮族);lstMZ.Add(O9,布依族);lstMZ.Add(10朝鲜族lstMZ.Add(T 1,满族);lstMZ.Add(T2侗族lstMZ.Add(13,瑶族);lstMZ.Add(14 1 白族力lstMZ.Add(,15土家族);lstMZ.Add(16,lstMZ.Add(17哈萨克族”lstMZ.Add(18傣族);lstMZ.Add(19,
32、黎族);lstMZ.Add(20M族);lstMZ.Add(21,值族);lstMZ.Add(22畲族);lstMZ.Add(,23高山族);lstMZ.Add(24拉祜族);lstMZ.Add(25水族);lstMZ.Add(,26东乡族,);lstMZ.Add(,27纳西族,);lstMZ.Add(28,景颇族);lstMZ.Add(,29柯尔克孜族);lstMZ.AddC3(T,土族);lstMZ.Add(31,达翰尔族);lstMZ.Add(32侬佬族”lstMZ.Add(,331 羌族);lstMZ.Add(34布朗族,);lstMZ.Add(35,撒拉族);lstMZ.Add(36
33、毛南族);lstMZ.Add(37,彳乞佬族);lstMZ.Add(38,锡伯族);lstMZ.Add(39,河昌族);lstMZ.Add(401 普米族lstMZ.Add(417 塔吉克族);lstMZ.Add(42怒族);lstMZ.Add(43,乌孜别克族);lstMZ.Add(44,俄罗斯族);lstMZ.Add(45鄂温克族);lstMZ.Add(,46德昂族lstMZ.Add(47,保安族);lstMZ.Add(,4&,裕固族,);lstMZ.Add(,49京族);lstMZ.Add(5O,塔塔尔族);lstMZ.Add(51,独龙族lstMZ.Add(52鄂伦春族);lstMZ.
34、Add(53,赫哲族);lstMZ.Add(,门巴族lstMZ.Add(55,珞巴族);lstMZ.Add(56 基诺族);lstMZ.Add(,57其它);lstMZ.Add(98,外国人入籍);public string Name(get return _Name;set _Name=value;)public string Sex_Codeget return _Sex_Code;set_Sex_Code=value;switch(value)(case T:Sex_CName=男;break;case 2:Sex_CName=女;break;)public string Sex_CNa
35、me(get return _Sex_CName;set _Sex_CName=value;)public string I DCget return _IDC;set _IDC=value;)public string NATION_Code(get return _NATION_Code;set(_NATION_Code=value;if(IstM乙Contains(value)NATION_CName=lstMZvalue.ToString();)public string NATION_CName(get return _NATION_CName;set _NATION_CName=v
36、alue;)public DateTime BIRTH(get return _BIRTH;set _BIRTH=value;)public string ADDRESSget return _ADDRESS;set _ADDRESS=value;)public string REGORG(get return _REGORG;set _REGORG=value;)public DateTime STARTDATE(get return _STARTDATE;set _STARTDATE=value;)public DateTime END DATE(get return _ENDDATE;s
37、et(_ENDDATE=value;if(_ENDDATE=DateTime.MaxValue)_Period_Of_Validity_Code=3;_Period_Of_Validity_CName=长期,;)else(if(_STARTDATE!=DateTime.MinValue)(switch(value.AddDays(l).Year-_STARTDATE.Year)(case 5:_Period_Of_Validity_Code=4;_Period_Of_Validity_CName=5 年;break;case 10:_Period_Of_Validity_Code=T;_Per
38、iod_Of_Validity_CName=,10 年;break;case 20:_Period_Of_Validity_Code=2;_Period_Of_Validity_CName=,20 年;break;)public string Period_Of_Validity_Code(get return _Period_Of_Validity_Code;set _Period_Of_Validity_Code=value;public string Period_Of_Validity_CName(get return _Period_Of_Validity_CName;set _Pe
39、riod_Of_Validity_CName=value;public byte PIC_Byte(get return _PIC_Byte;set _PIC_Byte=value;public Image PIC_lmageget return _PIC_lmage;set _PIC_lmage=value;)转载 二代身份证读卡器接口函数De I phi声明(2010-06-30 22:09:33)转载原文标签:转载原文地址:二代身份证读卡器接口函数D el p h i 声明作 者:虚伪人生前段时间做项目时用的,拿来一看全是C+的 d l l,就对应写了一下D el p h i 的声明查看
40、串口当前波特率fun c ti o n S D T _ G etC O MB a ud(i P o r t:i n teger;p ui B a ud Ra te:P i n teger):i n teger;s td c a l l;E xter n a l S D T A P I.D LL;i P o r t i n 表示端口,p ui B a ud Ra te o ut 无符号指针,指向普通串口当前波特率,返回值0 X 9 0-成功,0 x1-端口打开失败/端口号不合法,0 x5 无法获得S A M_ V 的波特率,串口不可用。设置S A M V的串口的波特率fun c ti o n S
41、 D T _ S tetC O MB a ud (i P o r t:i n teger;ui C ur r B a ud:i n teger;ui S etB a ud:i n teger):i n teger;s td c a l l l E xter n a l S D T A P I.D LL ;手持终端i P o r t i n 表示端口,ui C ur r B a ud i n 调用改A P I前已设置的业务终端与S A M_ V 通信的波特率(出厂默认为1 1 5 2 0 0)ui C ur r B a ud 只能为 1 1 5 2 0 0,5 7 6 0 0,3 7 8 4 0
42、 0,1 9 2 0 0,9 6 0 0。如果 ui C ur r B a ud 数值不是这些值之一,函数返回0 x2 1,如果和已设置的不一样,函数返回0 x0 2 表示不能设置调用A P I不成功。ui S etB a ud i n 将要设置的S A M_ V 波特率,只能为(同上)那些值,如果不是这些数值,返回也同上函数返回0 x9 0-成功,0 x1-端口打开失败/端口号不合法,0 x2-超时,设置不成功,0 x2 1-ui C ur r B a ud ui S etB a ud 输入参数数值错误打开串口/U S Bfun c ti o n S D T O p en P o r t(i
43、 P o r t:i n teger):i n teger;s td c a l 1;E xter n a l S D T A P I.D LL;i P o r t i n 表示端口号,1-1 6(十进制)为串口,1 0 0 1-1 0 1 6(十进制)为U S B 口,缺省的一个U S B 设备端口是1 0 0 1 c函数返回0 x9 0-打开端口成功,1-打开端口失败/端口号不合法关闭串口/U S Bfun c ti o n S D T C l o s eP o r t(i P o r t:i n teger):i n teger;s td c a l 1;E xter n a l S D
44、 T A P I.D LL);i P o r t i n 表示端口号,返回值0 x9 0-关闭串口成功,0 x0 1-端口号不合法对 S A M_ V 复位fun c ti o n S D T Res etS A M(i P o r t:i n teger;i 1 fO p en:i n teger):i n teger;s td c a l 1;E xter n a l S D T A P I.D LL);i P o r t i n 表示端 口号,目前串口和 U S B 只支持 1 6 个,串口:0 0 0 1-0 0 1 6,U S B:1 0 0 1-1 0 1 6.i l f0 p e
45、n i n 表示不在该函数内部打开和关闭串口,非 0 表示在A P I函数内部包含了打开串口和关闭串口函数,之前不需要调用S D T _ 0 p en P o r t 和 S D T _ C l o s eP o r t返回值0 x9 0-成功,其他失败设置射频适配器最大通信字节数f u n ct i o n SD T Se t M a xR F B y t e(i P o r t:i n t e g e r j u cB y t e:C h a r j b l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l
46、SD T A P I.D LL;i P o r t i n 表示端口号,u cB y t e i n 无符号字符,24-255,表示射频适配器最大通信字节数,i l f 0p e n i n 参见 SD T _ R e s e t SA M返回值0 x90-成功,其他-失败对 SA M V 进行状态检测f u n ct i o n SD T Ge t SA M St a t u s(i P o r t:i n t e g e r;i l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l SD T A P I.D
47、LL;i P o r t i n 表示端口号,i l f Op e n 参见 SD T _ R e s e t SA M返回值0 x90-SA M _ V 正常,0 x60-自检失败,不能接收命令,其他-命令失败读取SA M V的编号f u n ct i o n SD T Ge t SA M ID(i P o r t:i n t e g e r;p u s SA M ID:P b y t e;i l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l,SD T A P I.D LL;i P o r t i n 表示
48、端口号,p u s SA M ID o u t 无符号字符串指针SA M _ V 编号,16字节,返回值0 x90-成功,其他-失败读取SA M V的编号f u n ct i o n SD T Ge t SA M ID T o St r(i P o r t:i n t e g e r;p cSA M ID:P b y t e;i l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l,SD T A P I.D LL;i p o r t i n 表示端口号,p u s SA M ID o u t SA M _ V 编
49、号,i l f Op e n i n 整数,参见 SD T _ R e s e t SA M返回值0 x90-成功,其他-失败开始找卡f u n ct i o n SD T _ St a r t F i n d ID C a r d(i P o r t:i n t e g e r;p u cM a n a l n f o:P b y t e;i l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l SD T A P I.D LL,;i p o r t i n 表示端口号,p u cM a n a l n f o
50、o u t 无符号指针,证/卡芯片管理号,4 个字节,i l f Op e n i n 参见 SD T _ R e s e t SA M返回值0 x9f-找卡成功,0 x80-找卡失败选卡f u n ct i o n SD T _ Se l e ct ID C a r d(i P o r t:i n t e g e r;p u cM a n a M s g:P b y t e;i l f Op e n:i n t e g e r):i n t e g e r;s t d ca l 1;E xt e r n a l SD T A P I.D LL;i P o r t i n 表示端口号,p u