net实现中国身份证号码验证源码

合集下载

Java身份证号码验证

Java身份证号码验证

import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SearchValidateUtils {//身份证校验系数表private static int[] coefficent ={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//身份证校验余数表private static char[] remainderTable = {'1','0','X','9','8','7','6','5','4','3','2'};/*** 搜索字符的替换,对_和%进行转译* @param String src要转译的字符串* @return String 转译完成的字符串** */public static String toSearchString(String src){String des = src.trim();des.replaceAll("\\_", "\\_");des.replaceAll("\\%", "\\%");return des;}/*** 验证身份证的真伪* @param String src身份证号码* @return 若为真,则返回IdResult对象,中isTrue为true,否则返回IdResult中isTrue 为false** */public static IdResult isIdNumber(String src){/*六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码*顺序码的奇数分配给男性,偶数分配给女性**/IdResult result = new IdResult();String des = src.trim().toUpperCase();//长度不是18,直接返回nullif(des.length() != 18){return result;}//字符类型不是17个数字,加1个数字或者X,直接返回null String regExp = "^\\d{17}[\\dX]$";Pattern pattern = pile(regExp);Matcher matcher = pattern.matcher(des);if(!matcher.find()){return result;}int validateSum = 0;for(int i=0;i<17;i++){validateSum += (des.charAt(i)-'0')*coefficent[i];}int remainder = validateSum % 11;char lastCharacter = des.charAt(17);if(lastCharacter == remainderTable[remainder]){//如果校验正确result.setTrue(true);//提取性别String sex = ((des.charAt(16)-'0') & 0x01) == 1 ? "F":"M";result.setSex(sex);//提取年龄String birth = des.substring(6, 14);int birthYear = Integer.parseInt(birth.substring(0, 4));int birthMonthDay = Integer.parseInt(birth.substring(4,8));SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String now = sdf.format(new Date(System.currentTimeMillis()));int nowYear = Integer.parseInt(now.substring(0,4));int nowMonthDay = Integer.parseInt((now.substring(4,8)));int age = nowYear - birthYear;if(nowMonthDay < birthMonthDay){age --;}result.setAge(age);}return result;}static class IdResult{/*** F:男M:女* */private String sex;/*** 年龄* */private int age;/*** 是否有效* */private boolean isTrue;public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isTrue() {return isTrue;}public void setTrue(boolean isTrue) { this.isTrue = isTrue;}@Overridepublic String toString(){return "[isTrue:"+this.isTrue + ",sex:"+this.sex+",age:"+this.age+"]";}}}。

ASP.NETCore身份认证(Identity、Authentication)

ASP.NETCore身份认证(Identity、Authentication)

Core⾝份认证(Identity、Authentication)Authentication和Authorization每每说到⾝份验证、认证的时候,总不免说提及⼀下这2个词。

他们的看起来⾮常的相似,但实际上他们是不⼀样的。

Authentication想要说明⽩的是你是谁(你的⾝份是什么)Authorization想要说明⽩的是你能做什么(得到了什么权限)但是这两个词通常是要同时存在的。

要知道有什么权限前提是知道你是谁。

OAuth2认证这是最近很流⾏的认证的标准。

要完全理解他的话也要说上⼀⼤篇,在这⾥简单点说明:第三⽅⽹站能够得到认证⽅提供的⾝份和授予的权限。

就是上⾯提到的Authorization说个例⼦这⾥似乎说个栗⼦会⽐较好,例如搭乘飞机:假设你购买了⼀张南⽅航空的机票。

那么你去坐飞机的时候可能会出现以下场景:1.到南⽅航空的柜台checkin。

得到⼀张纸质的,上⾯有你⾝份证信息,航班信息。

2.到⼊站⼝被检票⼈员查票。

检票员会查看你的机票是否正确,机票⾝份信息是否与你的⾝份证信⼼对应。

3.到VIP休息室等待登机。

被服务⼈员告知你并没有权限进⼊VIP休息室,原因是购买的是普通票,⾮贵宾票。

4.登机,⼊座。

空乘⼈员核对你的航班是否对应当前的航班。

好了,上⾯的⼏个场景跟认证是相当的相似。

第⼀步checkin,对应的是认证系统,纸质票就是提供的票据。

第⼆步就相当于你⾃⼰的⽹站,得到了南⽅航空的认证,只要知道是南⽅航空颁发的票据,你都认为是有效的。

这⾥也有个特别的地⽅,就是机场不可能只认南⽅航空,可能东⽅航空,春秋航空都认,所以这个也是认证的特点,你的⽹站是可以同时实现多个具有相同规则的认证⽅提供的票据。

第三步相当于是权限的验证,虽然客户⼿上是有票据,但由于票据上声明(Claim)的权限并不包含VIP休息室使⽤。

第四步相当于允许的权限,有这个票据,可以指定做某些可做的事情。

为什么要⽤现在的服务基本上都是集群的,进⾏的⽹络通讯也以⽆状态请求为主。

C#读取二代身份证信息源码

C#读取二代身份证信息源码

本文由synjones2008贡献doc文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

C#读取二代身份证信息源码读取二代身份证信息源码using System; using System.Drawing; using System.Collections; using ponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection ; using System.IO; namespace ICCard { public class clsICCard { //首先,声明通用接口[DllImport('sdtapi.dll')] public static extern int SDT_OpenPort(int iPortID); [DllImport('sdtapi.dll')] public static extern int SDT_ClosePort(int iPortID); [DllImport('sdtapi.dll')] public static extern int SDT_PowerManagerBegin(int iPortID, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_AddSAMUser(int iPortID, string pcUserName, int iIfOpen); [DllImport('sdtapi.dll')]public static extern int SDT_SAMLogin(int iPortID, string pcUserName, string pcPasswd, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_SAMLogout(int iPortID, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_UserManagerOK(int iPortID, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ChangeOwnPwd(int iPortID, string pcOldPasswd, string pcNewPasswd, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ChangeOtherPwd(int iPortID, string pcUserName, string pcNewPasswd, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_DeleteSAMUser(int iPortID, string pcUserName, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_StartFindIDCard(int iPortID, ref int pucIIN, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_SelectIDCard(int iPortID, ref int pucSN, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ReadBaseMsg(int iPortID, string pucCHMsg, ref int puiCHMsgLen, string pucPHMsg, ref int puiPHMsgLen, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ReadBaseMsgToFile(int iPortID, string fileName1, ref int puiCHMsgLen, string fileName2, ref int puiPHMsgLen, int iIfOpen); [DllImport('sdtapi.dll')]public static extern int SDT_WriteAppMsg(int iPortID, ref byte pucSendData, int uiSendLen, ref byte pucRecvData, ref int puiRecvLen, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_WriteAppMsgOK(int iPortID, ref byte pucData, int uiLen, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_CancelWriteAppMsg(int iPortID, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ReadNewAppMsg(int iPortID, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ReadAllAppMsg(int iPortID, ref byte pucAppMsg, ref int puiAppMsgLen, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_UsableAppMsg(int iPortID, ref byte ucByte, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_GetUnlockMsg(int iPortID, ref byte strMsg, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_GetSAMID(int iPortID, ref byte StrSAMID, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_SetMaxRFByte(int iPortID, byte ucByte, int iIfOpen); [DllImport('sdtapi.dll')] public static extern int SDT_ResetSAM(int iPortID, intiIfOpen); [DllImport('WltRS.dll')] public static extern int GetBmp(string file_name, int intf);public delegate void De_ReadICCardComplete(clsEDZ objEDZ); public event De_ReadICCardComplete ReadICCardComplete; private clsEDZ objEDZ = new clsEDZ(); private int EdziIfOpen = 1; //自动开关串口int EdziPortID; public clsICCard() { } public bool ReadICCard() { bool bUsbPort = false; int intOpenPortRtn = 0; int rtnTemp = 0; int pucIIN = 0; int pucSN = 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 (!bUsbPort) { for (int iPort = 1; iPort <= 2; iPort++) { intOpenPortRtn = SDT_OpenPort(iPort); if (intOpenPortRtn == 144) { EdziPortID = iPort; bUsbPort = false; break; } } } if (intOpenPortRtn != 144){ MessageBox.Show(' 端口打开失败,请检测相应的端口或者重新连接读卡器! ', ' 提示 ', MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } //在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,//您要考虑机具连接端口被用户改变的情况哦 //下面找卡rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); if (rtnTemp != 159) { rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); //再找卡if (rtnTemp != 159) { rtnTemp = SDT_ClosePort(EdziPortID); MessageBox.Show(' 未放卡或者卡未放好,请重新放卡! ', ' 提示 ', MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } //选卡rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); if (rtnTemp != 144){ rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); //再选卡if (rtnTemp != 144) { rtnTemp = SDT_ClosePort(EdziPortID); MessageBox.Show('读卡失败!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);return false; } } //注意,在这里,用户必须有应用程序当前目录的读写权限//检测串口的机具连接if (!bUsbPort) { for (int iPort = 1; iPort <= 2; iPort++) { intOpenPortRtn = SDT_OpenPort(iPort); if (intOpenPortRtn == 144) { EdziPortID = iPort; bUsbPort = false; break; } }} if (intOpenPortRtn != 144) { MessageBox.Show(' 端口打开失败,请检测相应的端口或者重新连接读卡器! ', ' 提示 ', MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } //在这里,如果您想下一次不用再耗费检查端口的检查的过程,您可以把 EdziPortID 保存下来,可以保存在注册表中,也可以保存在配置文件中,我就不多写了,但是,//您要考虑机具连接端口被用户改变的情况哦 //下面找卡rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); if (rtnTemp != 159) { rtnTemp = SDT_StartFindIDCard(EdziPortID, ref pucIIN, EdziIfOpen); //再找卡if (rtnTemp != 159) { rtnTemp = SDT_ClosePort(EdziPortID); MessageBox.Show(' 未放卡或者卡未放好,请重新放卡! ', ' 提示 ', MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } }//选卡rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); if (rtnTemp != 144) { rtnTemp = SDT_SelectIDCard(EdziPortID, ref pucSN, EdziIfOpen); //再选卡if (rtnTemp != 144) { rtnTemp = SDT_ClosePort(EdziPortID); MessageBox.Show('读卡失败!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);return false; } } //注意,在这里,用户必须有应用程序当前目录的读写权限 FileInfo objFile = new FileInfo('wz.txt'); if (objFile.Exists) { objFile.Attributes = FileAttributes.Normal; objFile.Delete(); } objFile = new FileInfo('zp.bmp'); if (objFile.Exists) { objFile.Attributes = FileAttributes.Normal;objFile.Delete(); } objFile = new FileInfo('zp.wlt'); if (objFile.Exists) { objFile.Attributes = FileAttributes.Normal; objFile.Delete(); } rtnTemp = SDT_ReadBaseMsgToFile(EdziPortID, 'wz.txt', ref puiCHMsgLen, 'zp.wlt', ref puiPHMsgLen, EdziIfOpen); if (rtnTemp != 144) { rtnTemp = SDT_ClosePort(EdziPortID); MessageBox.Show('读卡失败!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } //下面解析照片,注意,如果在 C 盘根目录下没有机具厂商的授权文件 Termb.Lic,照片解析将会失败if (bUsbPort) rtnTemp = GetBmp('zp.wlt', 2); else rtnTemp = GetBmp('zp.wlt', 1); switch (rtnTemp){ case 0: MessageBox.Show('调用sdtapi.dll 错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case 1: //正常break; case -1: MessageBox.Show('相片解码错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -2: MessageBox.Show('wlt 文件后缀错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -3: MessageBox.Show('wlt 文件打开错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -4: MessageBox.Show('wlt 文件格式错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -5: MessageBox.Show('软件未授权!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; case -6:MessageBox.Show('设备连接错误!', '提示', MessageBoxButtons.OK, MessageBoxIcon.Error);break; } rtnTemp = SDT_ClosePort(EdziPortID); FileInfo f = new FileInfo('wz.txt'); FileStream fs = f.OpenRead(); byte[] bt = new byte[fs.Length]; fs.Read(bt, 0, (int)fs.Length); fs.Close(); string str = System.Text.UnicodeEncoding.Unicode.GetString(bt); =System.Text.UnicodeEncoding.Unicode.GetString(bt, 0, 30).Trim(); objEDZ.Sex_Code = System.Text.UnicodeEncoding.Unicode.GetString(bt, 30, 2).Trim(); objEDZ.NATION_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.Unicode.GetString(bt, 52, 70).Trim(); objEDZ.IDC = 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(0) 188).Trim(); objEDZ.STARTDATE = Convert.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(0, 4) + '年' + strTem.Substring(4, 2) + '月 ' + strTem.Substring(6, 2) + '日');} else { objEDZ.ENDDATE = DateTime.MaxValue; } objFile = new FileInfo('zp.bmp'); if (objFile.Exists) { Image img = Image.FromFile('zp.bmp'); objEDZ.PIC_Image=(Image)img.Clone(); System.IO.MemoryStream m = new MemoryStream(); img.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg); objEDZ.PIC_Byte = m.ToArray(); img.Dispose(); img = null; } ReadICCardComplete(objEDZ); return true; } } public class clsEDZ { private System.Collections.SortedList lstMZ = 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; private 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_Image; //照片二进制 //照片//有效期限public clsEDZ() {lstMZ.Add('01', '汉族'); lstMZ.Add('02', '蒙古族'); lstMZ.Add('03', '回族'); lstMZ.Add('04', '藏族'); lstMZ.Add('05', '维吾尔族'); lstMZ.Add('06', '苗族'); lstMZ.Add('07', '彝族'); lstMZ.Add('08', '壮族'); lstMZ.Add('09', '布依族'); lstMZ.Add('10', '朝鲜族'); lstMZ.Add('11', '满族'); lstMZ.Add('12', '侗族'); lstMZ.Add('13', '瑶族'); lstMZ.Add('14', '白族'); lstMZ.Add('15', '土家族'); lstMZ.Add('16', '哈尼族'); lstMZ.Add('17', '哈萨克族'); lstMZ.Add('18', '傣族'); lstMZ.Add('19', '黎族'); lstMZ.Add('20', '傈僳族'); 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.Add('30', '土族'); lstMZ.Add('31', '达翰尔族'); lstMZ.Add('32', '仫佬族'); lstMZ.Add('33', '羌族'); lstMZ.Add('34', '布朗族'); lstMZ.Add('35', '撒拉族'); lstMZ.Add('36', '毛南族'); lstMZ.Add('37', '仡佬族'); lstMZ.Add('38', '锡伯族'); lstMZ.Add('39', '阿昌族'); lstMZ.Add('40', '普米族'); lstMZ.Add('41', '塔吉克族'); lstMZ.Add('42', '怒族'); lstMZ.Add('43', '乌孜别克族'); lstMZ.Add('44', '俄罗斯族');lstMZ.Add('45', '鄂温克族'); lstMZ.Add('46', '德昂族'); lstMZ.Add('47', '保安族'); lstMZ.Add('48', '裕固族'); lstMZ.Add('49', '京族'); lstMZ.Add('50', '塔塔尔族'); lstMZ.Add('51', '独龙族'); lstMZ.Add('52', '鄂伦春族'); lstMZ.Add('53', '赫哲族'); lstMZ.Add('54', '门巴族'); lstMZ.Add('55', '珞巴族'); lstMZ.Add('56', '基诺族'); lstMZ.Add('57', '其它'); lstMZ.Add('98', '外国人入籍');} public string Name { get { return _Name; } set { _Name = value; } } public string Sex_Code { get { return _Sex_Code; }set { _Sex_Code = value; switch (value) { case '1': Sex_CName = '男';break; case '2': Sex_CName = '女';break; } } } public string Sex_CName { get { return _Sex_CName; } set { _Sex_CName = value; } } public string IDC { get { return _IDC; }set { _IDC = value; } } public string NATION_Code { get { return _NATION_Code; } set { _NATION_Code = value; if (lstMZ.Contains(value)) NATION_CName = lstMZ[value].ToString(); } } public string NATION_CName { get { return _NATION_CName; } set { _NATION_CName = value; } } public DateTime BIRTH { get { return _BIRTH; } set { _BIRTH = value; } }public string ADDRESS { get { 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 ENDDATE { get { return _ENDDATE; } set { _ENDDATE = value; if (_ENDDATE == DateTime.MaxValue){ _Period_Of_Validity_Code = '3'; _Period_Of_Validity_CName = '长期';} else { if (_STARTDATE != DateTime.MinValue) { switch (value.AddDays(1).Year - _STARTDATE.Year) { case 5: _Period_Of_Validity_Code = '4'; _Period_Of_Validity_CName = '5 年';break; case 10: _Period_Of_Validity_Code = '1'; _Period_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 { _Period_Of_Validity_CName = value; } } public byte[] PIC_Byte { get { return _PIC_Byte; } set { _PIC_Byte = value; } } public Image PIC_Image {get { return _PIC_Image; } set { _PIC_Image = value; } } }。

身份证号码校验算法实现

身份证号码校验算法实现

/*** 【身份证号码的规则】1、15位身份证号码组成:ddddddyymmddxxs共15位,其中:* dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。

yy为2位的年份代码,是身份证持有人的出身年份。

* mm为2位的月份代码,是身份证持有人的出身月份。

dd为2位的日期代码,是身份证持有人的出身日。

这6位在一起组成了身份证持有人的出生日期。

* xx为2位的顺序码,这个是随机数。

s为1位的性别代码,奇数代表男性,偶数代表女性。

2、18位身份证号码组成:* ddddddyyyymmddxxsp共18位,其中:其他部分都和15位的相同。

年份代码由原来的2位升级到4位。

最后一位为校验位。

校验规则是:* (1)十七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和* Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2* (2)计算模Y = mod(S, 11) (3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8* 7 6 5 4 3 2 也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。

*/package citi;import java.util.Scanner;/*** @author D.puntu**/public class MyIdCard {private static String Id = null;private static String myIndexStr, index = null;private static int i = 0;private static int m = 0, n = 0, myIndex;private static int areaId, year, mon, day, sex;private static int id = 0;// 从第一位到第十七位的数字的权值private static int myArrayIndex[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,10, 5, 8, 4, 2 };public static void main(String[] args) {startIndex();}private static void startIndex() {Scanner in = new Scanner(System.in);System.out.println("请输入身份证号(18位数字):");Id = in.next();i = Id.length();while (i != 18) {if (i > 18) {System.out.println("身份证号码只有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();} else if (i < 18) {System.out.println("身份证号码应该有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();}}if (i == 18) {while (!getAreaId(Id, i) || !getYear(Id, i) || !getMon(Id, i)|| !getDay(Id, i)) {Id = in.next();i = Id.length();}}getIndex(Id, i, getSum(Id, i));}private static int getSum(String id, int i) {for (m = 0; m < myArrayIndex.length; m++) {n = n + Integer.parseInt(id.substring(m, m + 1)) * myArrayIndex[m]; // 前17位加权后的和}myIndex = n % 11;// 取模return myIndex;}private static void getIndex(String id, int i, int m) {myIndexStr = id.substring(i - 1, i);// 取得校验位// 算出校验位switch (m) {case 0:index = "1";break;case 1:index = "0";break;case 2:index = "X";break;case 3:index = "9";break;case 4:index = "8";break;case 5:index = "7";break;case 6:index = "6";break;case 7:index = "5";break;case 8:index = "4";break;case 9:index = "3";break;case 10:index = "2";break;}if (index.equalsIgnoreCase(myIndexStr)) {System.out.println("输入的身份证号码有效!!");} else {System.out.println("输入的身份证号码无效!!");}}/*** 前六位范围110000----659001*/public static boolean getAreaId(String str, int i) {boolean myAreaId = false;areaId = Integer.parseInt(str.substring(id, id + 6));if (areaId > 659001 || areaId < 110000) {System.out.println("输入的身份证号码地址位有错误!!");myAreaId = false;} else {myAreaId = true;}return myAreaId;}public static boolean getYear(String str, int i) {boolean myYear = false;year = Integer.parseInt(str.substring(id + 6, id + 10));if (year > 2015 || year < 1865) {System.out.println("输入的身份证号码年份有错误!!请重新输入身份证号码");myYear = false;} else {myYear = true;}return myYear;}public static boolean getMon(String str, int i) {boolean myMon = false;mon = Integer.parseInt(str.substring(id + 10, id + 12));if (mon <= 12 && mon >= 1) {myMon = true;} else {System.out.println("输入的身份证号码月份有错误!!请重新输入身份证号码");}return myMon;}public static boolean getDay(String str, int i) {boolean myDay = false;int dayToMon = Integer.parseInt(str.substring(id + 10, id + 12));day = Integer.parseInt(str.substring(id + 12, id + 14));if (day >= 1 && day <= getMonday(dayToMon)) {myDay = true;} else {System.out.println("输入的身份证号码天数与对应的月份不一致!!请重新输入身份证号码");}return myDay;}public static int getMonday(int i) {int jDay = 0;switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:jDay = 31;case 4:case 6:case 9:case 11:jDay = 30;break;case 2:jDay = 28;}return jDay;}}。

身份证生成查询代码

身份证生成查询代码
}
if (sChecker[lSumQT%11] != sPaperId[17] )
{
return -1;
}
return 0;
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
printf("ID NO.=%s\n",id);
getch()();
}
/***************************************************
* 函 数 名: Chk18PaperId
*
* 函数功能: 校验18位身份证号码
************************************************************/
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
int i,n;
int sum;
{
k = k*2;
}
R[i] = k %11;
}
/*************************************************************
*Author :wacs5
*date :20101031(YYYMMDD)
*Function :计算身份证最后一位校验位(没有验证日期的可行性)
* :输入可以是18位身份证前17位,或老版的15位身份证号码
int Chk18PaperId (const char *sPaperId)

Python开发之身份证验证库i...

Python开发之身份证验证库i...

Python开发之⾝份证验证库i...上个星期,⼤佬分享了⼀个验证⾝份证号合法性的库:id_validator,没空去试着⽤⼀下看看,今天有点时间,来试着⽤下这个库。

1、⾸先,要安装这个库,windows+R键运⾏cmd,打开命令⾏窗⼝,输⼊下⾯的命令:pip install id_validator2、安装成功后,开始来使⽤这个库(1)、⾸先,输⼊命令 python:(2)、接着,引⽤这个库底下的⼀个模块,输⼊命令 from id_validator import validator(3)、依次输⼊下⾯的命令,来看下校验结果,返回False,校验⾝份证合法性失败,返回True,校验⾝份证合法性成功:validator.is_valid('440308************') #⼤陆18位⾝份证validator.is_valid(****************')#⼤陆15位⾝份证validator.is_valid('810000************') #港澳18位⾝份证validator.is_valid('830000199201300022') #台湾18位⾝份证(4)、接着,通过这个库底下的某个⽅法可以获取⾝份证相关的信息,输⼊命令:print(validator.get_info('330221************'))3、以上就是对验证⾝份证号合法性的库id_validator的简单介绍。

下⾯讲解使⽤⾝份证验证库id_validator返回住址等信息******************和***************⽰例⼤陆居民⾝份证均为随机⽣成的假数据,如撞车,请联系删除。

810000************ 和 830000199201300022 ⽰例港澳台居民居住证为北京市公安局公布的居住证样式号码。

身份证号码有效性校验程序delphi源代码

身份证号码有效性校验程序delphi源代码

身份证号码有效性校验程序delphi源代码unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm)Edit1: TEdit;Button1: TButton;Label1: TLabel;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}function GetVerifyBit(sIdentityNum: string): Char; //取得最后一位校验码:公式varnNum: Integer;beginResult := #0; //求总nNum := StrToInt(sIdentityNum[1]) * 7 +StrToInt(sIdentityNum[2]) * 9 +StrToInt(sIdentityNum[3]) * 10 +StrToInt(sIdentityNum[4]) * 5 +StrToInt(sIdentityNum[5]) * 8 +StrToInt(sIdentityNum[6]) * 4 +StrToInt(sIdentityNum[7]) * 2 +StrToInt(sIdentityNum[8]) * 1 +StrToInt(sIdentityNum[9]) * 6 +StrToInt(sIdentityNum[10]) * 3 +StrToInt(sIdentityNum[11]) * 7 +StrToInt(sIdentityNum[12]) * 9 +StrToInt(sIdentityNum[13]) * 10 +StrToInt(sIdentityNum[14]) * 5 +StrToInt(sIdentityNum[15]) * 8 +StrToInt(sIdentityNum[16]) * 4 +StrToInt(sIdentityNum[17]) * 2;nNum := nNum mod 11; //除11取余case nNum of //对应的校验码0: Result := '1';1: Result := '0';2: Result := 'X';3: Result := '9';4: Result := '8';5: Result := '7';6: Result := '6';7: Result := '5';8: Result := '4';9: Result := '3';10: Result := '2';end;end;function ValidatePID(const APID: string): string; varL: Integer;sCentury: string;sYear2Bit: string;sMonth: string;sDate: string;sSex: string;iSex: Integer;iCentury: Integer;iMonth: Integer;iDate: Integer;CRCFact: string; //18位证号的实际值CRCTh: string; //18位证号的理论值FebDayAmt: Byte; //2月天数beginL := Length(APID); //校验长度if (L in [15, 18]) = False thenbeginResult := Format('身份证号不是15位或18位(实际位数:%1:d)', [APID, L]);Exit;end;CRCFact := '';if L = 18 thenbeginsCentury := Copy(APID, 7, 2);iCentury := StrToInt(sCentury);if (iCentury in [18..20]) = False thenbeginResult := Format('身份证号码无效:18位证号的年份前两位(当前为:%0:S)不在18-20之间', [sCentury]);Exit;end;sYear2Bit := Copy(APID, 9, 2);sMonth := Copy(APID, 11, 2);sDate := Copy(APID, 13, 2);CRCFact := Copy(APID, 18, 1);iSex := StrToInt(Copy(APID, 17, 1));endelsebeginsCentury := '19';sYear2Bit := Copy(APID, 7, 2);sMonth := Copy(APID, 9, 2);sDate := Copy(APID, 11, 2);iSex := StrToInt(Copy(APID, 15, 1));end;iMonth := StrToInt(sMonth);iDate := StrToInt(sDate);if (iMonth in [01..12]) = False thenbeginResult := Format('身份证号码无效:月份(%0:s)无效!不在“01-12”之间!', [sMonth]);Exit;end;if (iMonth in [1, 3, 5, 7, 8, 10, 12]) thenbeginif (iDate in [01..31]) = False thenbeginResult := Format('身份证号码无效:日期(%0:s)无效!不在“1-31”之间!', [sDate]);Exit;end;end;if (iMonth in [4, 6, 9, 11]) thenbeginif (iDate in [01..30]) = False thenbeginResult := Format('身份证号码无效:日期(%0:s)无效!不在“1-30”之间!', [sDate]);Exit;end;end;//闰年if IsLeapYear(StrToInt(sCentury + sYear2Bit)) = True thenbeginFebDayAmt := 29;endelsebeginFebDayAmt := 28;end;if (iMonth in [2]) thenbeginif (iDate in [01..FebDayAmt]) = False thenbeginResult := Format('身份证号码无效:日期(%0:s)无效!不在“1-'+inttostr(FebDayAmt)+'”之间!', [sDate]);Exit;end;end;if iSex mod 2 = 0 thenbeginsSex := '女';endelsebeginsSex := '男';end;if CRCFact <> '' thenbeginCRCTh := GetVerifyBit(APID);if CRCFact <> CRCTh thenbeginResult := Format('身份证号码无效!请按以下步骤进行检查:'#13'1、最后一位要改成:“' + CRCTh + '”吗?(现在是:'+CRCFact+')'#13'2、出生日期是“' + sCentury + sYear2Bit + '年' + inttostr(iMonth) + '月' +inttostr(iDate) + '日”(' +sCentury + sYear2Bit +sMonth+sDate+ ')对吗?'#13'3、性别为“' + sSex + '”(倒数第2位是:' + inttostr(iSex) + ')对吗?'#13'4、前6位地区码为:' + Copy(APID, 1, 6) + ',对吗?'#13'5、倒数第4、3位('+Copy(APID, L-3, 2)+')是否正确?', [APID]);Exit;end;Result := '身份证号正确('+inttostr(L)+'位,带校验码)!出生日期:' + sCentury + sYear2Bit + '年' + inttostr(iMonth) + '月' + inttostr(iDate) + '日,性别:' + sSex;endelsebeginResult := '身份证号正确('+inttostr(L)+'位,无校验码)!出生日期:' + sCentury + sYear2Bit + '年' + inttostr(iMonth) + '月' + inttostr(iDate) + '日,性别:' + sSex;end;end;procedure TForm1.Button1Click(Sender: TObject);beginMessageBox(GetActiveWindow(), pchar(ValidatePID(Edit1.Text)), '提示信息!',mb_iconwarning);end;end.。

全国身份证校验html源码

全国身份证校验html源码

<!DOCTYPE html><html><head><meta charset="utf-8"><script type="text/javascript">//检查输入的身份证是否合法,必须是18位function checkIDcard(idcode18) {if (!cidInfoext(idcode18, "身份证号码:["+ document.getElementById(idcode18).value + "] ")) return resultErr();return true}var aCity = {11 : "北京",12 : "天津",13 : "河北",14 : "山西",15 : "内蒙古",21 : "辽宁",22 : "吉林",23 : "黑龙江",31 : "上海",32 : "江苏",33 : "浙江",34 : "安徽",35 : "福建",36 : "江西",37 : "山东",41 : "河南",42 : "湖北",43 : "湖南",44 : "广东",45 : "广西",46 : "海南",50 : "重庆",51 : "四川",52 : "贵州",53 : "云南",54 : "西藏",61 : "陕西",62 : "甘肃",63 : "青海",64 : "宁夏",65 : "新疆",71 : "台湾",81 : "香港",82 : "澳门",91 : "国外"}var err = "";function cidInfoext(nm, desc) {err = "";var sId = document.getElementById(nm).value;var iSum = 0;var info = "";var len = sId.length;if (!(len == 18)) {document.getElementById(nm).focus();err = desc + "长度必须是18位!";document.getElementById(nm).style.backgroundColor = "#FF7575";return false;}if (len == 15) {var m_flag = validId15(sId);if (m_flag == true) {document.getElementById(nm).style.backgroundColor = "#FFFFFF";return true;}}if (!/^\d{17}(\d|x)$/i.test(sId)) {document.getElementById(nm).focus();err = desc + "不符合规范!";document.getElementById(nm).style.backgroundColor = "#FF7575";return false;}sId = sId.replace(/x$/i, "a");if (aCity[parseInt(sId.substr(0, 2))] == null) {document.getElementById(nm).focus();err = desc + "地区非法";document.getElementById(nm).style.backgroundColor = "#FF7575";return false;}var sBirthday = sId.substr(6, 4) + "-" + Number(sId.substr(10, 2))+ "-" + Number(sId.substr(12, 2));var d = new Date(sBirthday.replace(/-/g, "/"))if (sBirthday != (d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate())) {document.getElementById(nm).focus();err = desc + "非法生日";document.getElementById(nm).style.backgroundColor = "#FF7575";return false;}for (var i = 17; i >= 0; i--)iSum += (Math.pow(2, i) % 11) * parseInt(sId.charAt(17 - i), 11) if (iSum % 11 != 1) {document.getElementById(nm).focus();err = desc + "非法证号";document.getElementById(nm).style.backgroundColor = "#FF7575";return false;}var idCode = document.getElementById(nm).value;if (idCode.substring(17, 18) == 'x') {document.getElementById(nm).value = idCode.replace("x", "X");}document.getElementById(nm).style.backgroundColor = "#FFFFFF";return true;}function resultErr() {alert(err);return false;}</script></head><body>身份证号:&nbsp;<input name="idcode18" class="input_click" id="idcode18"style="width: 150px; height: 23px; background-color: rgb(255, 117, 117);"onchange="checkIDcard('idcode18')" type="text" size="25"></body></html>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.net实现中国身份证号码验证源码
using System;
///
/// Summary descr ip tion for IDCardValid
///
public cl as s IDCardValid
{
public IDCardValid()
{
//
// TODO: Add constructor logic here
//
}
///
/// 验证身份证号码
///
/// 身份证号码
/// 验证成功为True,否则为False
public static bool CheckIDCard(string Id)
{
if (Id.Length == 18)
{
bool check = CheckIDCard18(Id);
return check;
}
else if (Id.Length == 15)
{
bool check = CheckIDCard15(Id);
return check;
}
else
{
return false;
}
}
#region 身份证号码验证
///
/// 验证15位身份证号
///
/// 身份证号
/// 验证成功为True,否则为False
private static bool CheckIDCard18(string Id)
{
long n = 0;
if (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0').Replace('X', '0'), out n) == false)
{
return false;//数字验证
}
string address =
"11x22x35x44x53x12x23x36x45x54x13x31x37x46x6 1x14x32x41x50x62x15x33x42x51x63x21x34x43x52 x64x65x71x81x82x91";
if (address.IndexOf(Id.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = Id.Substring(6, 8).Insert (6, "-").Insert(4, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
return false;//生日验证
}
string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
char[] Ai = Id.Remove(17).ToCharArray();
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
}
int y = -1;
Math.DivRem(sum, 11, out y);
if (arrVarifyCode[y] != Id.Substring(17,
1).ToLower())
{
return false;//校验码验证
}
return true;//符合GB11643-1999标准
}
///
/// 验证18位身份证号
///
/// 身份证号
/// 验证成功为True,否则为False
private static bool CheckIDCard15(string Id)
{
long n = 0;
if (long.TryParse(Id, out n) == false || n <
1
Math.Pow(10, 14))
{
return false;//数字验证
}
string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x6
1x14x32x41x50x62x15x33x42x51x63x21x34x43x52
x64x65x71x81x82x91";
if (address.IndexOf(Id.Remove(2)) == -1)
{
return false;//省份验证
}
string birth = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
DateTime time = new DateTime();
if (DateTime.TryParse(birth, out time) == false)
{
&n
bsp; return false;//生日验证
}
return true;//符合15位身份证标准
}
#endregion
}
2。

相关文档
最新文档