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>。

PHP实现中国公民身份证号码有效性验证示例代码

PHP实现中国公民身份证号码有效性验证示例代码

PHP实现中国公民⾝份证号码有效性验证⽰例代码本⽂将使⽤Java实现中国公民(15位或者18位)⾝份证号码的相关验证,功能如下:1. ⾝份证号有效性验证2. 分析详细⾝份证信息3. ⽣成⼀个虚拟的省份证号码。

⾝份证号码验证1、号码的结构公民⾝份号码是特征组合码,由⼗七位数字本体码和⼀位校验码组成。

排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。

2、地址码(前六位数)表⽰编码对象常住户⼝所在县(市、旗、区)的⾏政区划代码,按GB/T2260的规定执⾏。

3、出⽣⽇期码(第七位⾄⼗四位)表⽰编码对象出⽣的年、⽉、⽇,按GB/T7408的规定执⾏,年、⽉、⽇代码之间不⽤分隔符。

4、顺序码(第⼗五位⾄⼗七位)表⽰在同⼀地址码所标识的区域范围内,对同年、同⽉、同⽇出⽣的⼈编定的顺序号,顺序码的奇数分配给男性,偶数分配给⼥性。

5、校验码(第⼗⼋位数)(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 2IDValidator.php<?phpnamespace com\jdk5\blog\IDValidator;class IDValidator {private static $GB2260;private static $instance;private static $cache = array();private static $util;function __construct() {if (!class_exists("com\jdk5\blog\IDValidator\GB2260")){include 'GB2260.php';}if (!class_exists("com\jdk5\blog\IDValidator\util")){include 'util.php';}self::$GB2260 = GB2260::getGB2260 ();self::$util = util::getInstance();}public static function getInstance() {if (is_null ( self::$instance )) {self::$instance = new IDValidator ();}return self::$instance;}function isValid($id) {$code = self::$util->checkArg ( $id );if ($code === false) {return false;}// 查询cacheif (isset ( self::$cache [ $id ] ) && self::$cache [$id] ['valid'] !== false) {return self::$cache [$id] ['valid'];} else {if (! isset ( self::$cache [ $id ] )) {self::$cache [$id] = array ();}}$addr = substr ( $code ['body'], 0, 6 );$birth = $code ['type'] === 18 ? substr ( $code ['body'], 6, 8 ) :substr ( $code ['body'], 6, 6 );$order = substr ( $code ['body'], - 3 );if (! (self::$util->checkAddr ( $addr ) && self::$util->checkBirth ( $birth ) &&self::$util->checkOrder ( $order ))) {self::$cache [$id] ['valid'] = false;return false;}// 15位不含校验码,到此已结束if ($code ['type'] === 15) {self::$cache [$id] ['valid'] = true;/* 校验位部分 */// 位置加权$posWeight = array ();for($i = 18; $i > 1; $i --) {$wei = self::$util->weight ( $i );$posWeight [$i] = $wei;}// 累加body部分与位置加权的积$bodySum = 0;$bodyArr = str_split( $code ['body'] );for($j = 0; $j < count ( $bodyArr ); $j ++) {$bodySum += (intval ( $bodyArr [$j], 10 ) * $posWeight [18 - $j]);}// 得出校验码$checkBit = 12 - ($bodySum % 11);if ($checkBit == 10) {$checkBit = 'X';} else if ($checkBit > 10) {$checkBit = $checkBit % 11;}// 检查校验码if ($checkBit != $code ['checkBit']) {self::$cache [$id] ['valid'] = false;return false;} else {self::$cache [$id] ['valid'] = true;return true;}}// 分析详细信息function getInfo ($id) {// 号码必须有效if ($this->isValid($id) === false) {return false;}// TODO 复⽤此部分$code = self::$util->checkArg($id);// 查询cache// 到此时通过isValid已经有了cache记录if (isset(self::$cache[$id]) && isset(self::$cache[$id]['info'])) {return self::$cache[$id]['info'];}$addr = substr($code['body'], 0, 6);$birth = ($code['type'] === 18 ? substr($code['body'], 6, 8) :substr($code['body'], 6, 6));$order = substr($code['body'], -3);$info = array();$info['addrCode'] = $addr;if (self::$GB2260 !== null) {$info['addr'] = self::$util->getAddrInfo($addr);}$info ['birth'] = ($code ['type'] === 18 ? (substr ( $birth, 0, 4 ) . '-' . substr ( $birth, 4, 2 ) . '-' . substr ( $birth, - 2 )) : ('19' . substr ( $birth, 0, 2 ) . '-' . substr ( $birth, 2, 2 ) . '-' . substr ( $birth, - 2 ))); $info['sex'] = ($order % 2 === 0 ? 0 : 1);$info['length'] = $code['type'];if ($code['type'] === 18) {$info['checkBit'] = $code['checkBit'];}// 记录cacheself::$cache[$id]['info'] = $info;return $info;}// 仿造⼀个号function makeID ($isFifteen=false) {// 地址码$addr = null;if (self::$GB2260 !== null) {$loopCnt = 0;while ($addr === null) {// 防⽌死循环if ($loopCnt > 50) {$addr = 110101;break;}$prov = self::$util->str_pad(self::$util->rand(66), 2, '0');$city = self::$util->str_pad(self::$util->rand(20), 2, '0');$area = self::$util->str_pad(self::$util->rand(20), 2, '0');$addrTest = $prov . $city . $area;if (isset(self::$GB2260[$addrTest])) {$addr = $addrTest;break;}$loopCnt ++;}} else {// 出⽣年$yr = self::$util->str_pad(self::$util->rand(99, 50), 2, '0');$mo = self::$util->str_pad(self::$util->rand(12, 1), 2, '0');$da = self::$util->str_pad(self::$util->rand(28, 1), 2, '0');if ($isFifteen) {return $addr . $yr . $mo . $da. self::$util->str_pad(self::$util->rand(999, 1), 3, '1');}$yr = '19' . $yr;$body = $addr . $yr . $mo . $da . self::$util->str_pad(self::$util->rand(999, 1), 3, '1');// 位置加权$posWeight = array();for ($i = 18; $i > 1; $i--) {$wei = self::$util->weight($i);$posWeight[$i] = $wei;}// 累加body部分与位置加权的积$bodySum = 0;$bodyArr = str_split($body);for ($j = 0; $j < count($bodyArr); $j++) {$bodySum += (intval($bodyArr[$j], 10) * $posWeight[18 - $j]);}// 得出校验码$checkBit = 12 - ($bodySum % 11);if ($checkBit == 10) {$checkBit = 'X';} else if ($checkBit > 10) {$checkBit = $checkBit % 11;}return ($body . $checkBit);}}调⽤<?phpheader("Content-type: text/html; charset=utf-8");include 'IDValidator.php';$v = com\jdk5\blog\IDValidator\IDValidator::getInstance();//⽣成⼀个18位⾝份证号$id = $v->makeID();//获取⾝份证信息$info = $v->getInfo($id);var_dump($info);//⽣成⼀个15位⾝份证号$id = $v->makeID(true);$info = $v->getInfo($id);var_dump($info);//验证⾝份证号是否正确var_dump($v->isValid("123456789012345678"));以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

身份证验证代码

身份证验证代码
}
else
{
ห้องสมุดไป่ตู้emcpy(sDate, "20", 2);
}
memcpy(sDate+2, sIdCardNo + 6, 6);
iRet = CheckStrDate(sDate);
if (iRet < 0) {
strcpy(sRetDesc, "身份证日期错误");
iDate = atoi(sDate);
Sum += iWeight[i] * iDate;
}
Sum %= 11;
if ('x' == sIdCardNo[17])
{
sIdCardNo[17] = 'X';
memcpy(sDate, sIdCardNo + 6, 4);
iDate = atoi(sDate);
if (iDate < 1900 || iDate > 2020)
{
strcpy(sRetDesc, "身份证日期错误");
return FALSE;
}
memset(sDate, 0, sizeof(sDate));
memcpy(sDate, sIdCardNo + 6, 8);
iRet = CheckStrDate(sDate);
if (iRet == 0)
{
strcpy(sRetDesc, "身份证日期错误");
return TRUE;
}
// 对身份证号码进行本地校验
BOOL CheckId(char *sIdCardNo, char *sRetDesc)

ASP.NETCore通过特性实现参数验证

ASP.NETCore通过特性实现参数验证

Core通过特性实现参数验证 微软在 Core框架中内置了⼀些验证参数的特性,让我们可以通过这些特性对API请求中的参数进⾏验证,常⽤的特性⼀般有:[ValidateNever]: ValidateNeverAttribute 指⽰应从验证中排除属性或参数。

[CreditCard]:验证属性是否具有信⽤卡格式。

[Compare]:验证模型中的两个属性是否匹配。

[EmailAddress]:验证属性是否具有电⼦邮件格式。

[Phone]:验证属性是否具有电话号码格式。

[Range]:验证属性值是否位于指定范围内。

[RegularExpression]:验证属性值是否与指定的正则表达式匹配。

[Required]:验证字段是否不为 null。

[StringLength]:验证字符串属性值是否不超过指定的长度限制。

[Url]:验证属性是否具有 URL 格式。

但除了上⾯这些,还缺少⼀些我们平时在项⽬中会经常碰到的验证,例如:需要是纯汉字的姓名、必须包含⼤⼩写字母和数字的强密码、QQ号、IPV4或者IPV6地址,以及中国的⼿机号码和⾝份证号码等等。

当我们碰到这些参数需要验证的时候,我们需要如何实现⾃定义的验证特性呢?此时微软已经指出,让我们去继承ValidationAttribute类,并重写IsValid()即可。

1///<summary>2///是否是英⽂字母、数字组合3///</summary>4public class EnglishNumberCombinationAttribute : ValidationAttribute5 {6///<summary>7///默认的错误提⽰信息8///</summary>9private const string error = "⽆效的英⽂字母加数字组合";1011protected override ValidationResult IsValid(object value, ValidationContext validationContext)12 {13//这⾥是验证的参数的逻辑 value是需要验证的值⽽validationContext中包含了验证相关的上下⽂信息这⾥我是有⼀个⾃⼰封装的验证格式的FormatValidation类14if (FormatValidation.IsCombinationOfEnglishNumber(value as string))15//验证成功返回 success16return ValidationResult.Success;17//不成功提⽰验证错误的信息18else return new ValidationResult(ErrorMessage ?? error);19 }20 } 这⾥是实现⼀个英⽂字母数字组合的验证特性,这样我们就可以把它附在在我们请求的参数上,可以是DTO⾥的属性,也可以是Action上的形参。

java算法之身份证号码验证

java算法之身份证号码验证

java算法之⾝份证号码验证调⽤时直接new IDCard().verify(⾝份证id);就可以了实现代码如下:public class IDCard {private String _codeError;//wi =2(n-1)(mod 11)final int[] wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};// verify digitfinal int[] vi = {1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2};private int[] ai = new int[18];private static String[] _areaCode={"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"};private static HashMap<String,Integer> dateMap;private static HashMap<String,String> areaCodeMap;static{dateMap=new HashMap<String,Integer>();dateMap.put("01",31);dateMap.put("02",null);dateMap.put("03",31);dateMap.put("04",30);dateMap.put("05",31);dateMap.put("06",30);dateMap.put("07",31);dateMap.put("08",31);dateMap.put("09",30);dateMap.put("10",31);dateMap.put("11",30);dateMap.put("12",31);areaCodeMap=new HashMap<String,String>();for(String code:_areaCode){areaCodeMap.put(code,null);}}//验证⾝份证位数,15位和18位⾝份证public boolean verifyLength(String code){int length=code.length();if(length==15 || length==18){return true;}else{_codeError="错误:输⼊的⾝份证号不是15位和18位的";return false;}}//判断地区码public boolean verifyAreaCode(String code){String areaCode=code.substring(0,2);// Element child= _areaCodeElement.getChild("_"+areaCode);if(areaCodeMap.containsKey(areaCode)){return true;}else{_codeError="错误:输⼊的⾝份证号的地区码(1-2位)["+areaCode+"]不符合中国⾏政区划分代码规定(GB/T2260-1999)";return false;}}//判断⽉份和⽇期public boolean verifyBirthdayCode(String code){//验证⽉份String month=code.substring(10,12);boolean isEighteenCode=(18==code.length());if(!dateMap.containsKey(month)){_codeError="错误:输⼊的⾝份证号"+(isEighteenCode?"(11-12位)":"(9-10位)")+"不存在["+month+"]⽉份,不符合要求(GB/T7408)";return false;}//验证⽇期String dayCode=code.substring(12,14);Integer day=dateMap.get(month);String yearCode=code.substring(6,10);Integer year=Integer.valueOf(yearCode);//⾮2⽉的情况if(day!=null){if(Integer.valueOf(dayCode)>day || Integer.valueOf(dayCode)<1){_codeError="错误:输⼊的⾝份证号"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]号不符合⼩⽉1-30天⼤⽉1-31天的规定(GB/T7408)"; return false;}}//2⽉的情况else{//闰⽉的情况if((year%4==0&&year%100!=0)||(year%400==0)){if(Integer.valueOf(dayCode)>29 || Integer.valueOf(dayCode)<1){_codeError="错误:输⼊的⾝份证号"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]号在"+year+"闰年的情况下未符合1-29号的规定(GB/T7408)"; return false;}}//⾮闰⽉的情况else{if (Integer.valueOf(dayCode) > 28 || Integer.valueOf(dayCode) < 1) {_codeError="错误:输⼊的⾝份证号"+(isEighteenCode?"(13-14位)":"(11-13位)")+"["+dayCode+"]号在"+year+"平年的情况下未符合1-28号的规定(GB/T7408)"; return false;}}}return true;}//验证⾝份除了最后位其他的是否包含字母public boolean containsAllNumber(String code) {String str="";if(code.length()==15){str=code.substring(0,15);}else if(code.length()==18){str=code.substring(0,17);}char[] ch = str.toCharArray();for (int i = 0; i < ch.length; i++) {if (! (ch[i] >= '0' && ch[i] <= '9')) {_codeError="错误:输⼊的⾝份证号第"+(i+1)+"位包含字母";return false;}}return true;}public String getCodeError(){return _codeError;}//验证⾝份证public boolean verify(String idcard) {_codeError="";//验证⾝份证位数,15位和18位⾝份证if(!verifyLength(idcard)){return false;}//验证⾝份除了最后位其他的是否包含字母if(!containsAllNumber(idcard)){return false;}//如果是15位的就转成18位的⾝份证String eifhteencard="";if (idcard.length() == 15) {eifhteencard = uptoeighteen(idcard);}else{eifhteencard=idcard;}//验证⾝份证的地区码if(!verifyAreaCode(eifhteencard)){return false;}//判断⽉份和⽇期if(!verifyBirthdayCode(eifhteencard)){return false;}//验证18位校验码,校验码采⽤ISO 7064:1983,MOD 11-2 校验码系统if(!verifyMOD(eifhteencard)){return false;}return true;}//验证18位校验码,校验码采⽤ISO 7064:1983,MOD 11-2 校验码系统public boolean verifyMOD(String code){String verify = code.substring(17, 18);if("x".equals(verify)){code=code.replaceAll("x","X");verify="X";}String verifyIndex=getVerify(code);if (verify.equals(verifyIndex)) {return true;}// int x=17;// if(code.length()==15){// x=14;// }_codeError="错误:输⼊的⾝份证号最末尾的数字验证码错误"; return false;}//获得校验位public String getVerify(String eightcardid) {int remaining = 0;if (eightcardid.length() == 18) {eightcardid = eightcardid.substring(0, 17);}if (eightcardid.length() == 17) {int sum = 0;for (int i = 0; i < 17; i++) {String k = eightcardid.substring(i, i + 1);ai[i] = Integer.parseInt(k);}for (int i = 0; i < 17; i++) {sum = sum + wi[i] * ai[i];}remaining = sum % 11;}return remaining == 2 ? "X" : String.valueOf(vi[remaining]);}//15位转18位⾝份证public String uptoeighteen(String fifteencardid) {String eightcardid = fifteencardid.substring(0, 6);eightcardid = eightcardid + "19";eightcardid = eightcardid + fifteencardid.substring(6, 15);eightcardid = eightcardid + getVerify(eightcardid);return eightcardid;}作者:jason0539。

基于JAVA的身份证信息查询api调用代码实例

基于JAVA的身份证信息查询api调用代码实例

基于JAVA的身份证信息查询api调用代码实例代码描述:基于JA V A的身份证信息查询api调用代码实例关联数据:身份证查询接口平台:聚合数据import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.util.HashMap;import java.util.Map;import net.sf.json.JSONObject;/***身份证查询调用示例代码-聚合数据*在线接口文档:/docs/38**/public class JuheDemo {public static final String DEF_CHATSET = "UTF-8";public static final int DEF_CONN_TIMEOUT = 30000;public static final int DEF_READ_TIMEOUT = 30000;public static String userAgent = "Mozilla/5.0 (Windows NT 6.1) Appl eWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";//配置您申请的KEYpublic static final String APPKEY ="*************************";//1.身份证信息查询public static void getRequest1(){String result =null;String url ="/idcard/index";//请求接口地址Map params = new HashMap();//请求参数params.put("cardno","");//身份证号码params.put("dtype","");//返回数据格式:json或xml,默认jsonparams.put("key",APPKEY);//你申请的keytry{result =net(url, params, "GET");JSONObject object = JSONObject.fromObject(result);if(object.getInt("error_code")==0){System.out.println(object.get("result"));}else{System.out.println(object.get("error_code")+":"+object. get("reason"));}} catch(Exception e) {e.printStackTrace();}}//2.身份证泄漏查询public static void getRequest2(){String result =null;String url ="/idcard/leak";//请求接口地址Map params = new HashMap();//请求参数params.put("cardno","");//身份证号码params.put("dtype","");//返回数据格式:json或xml,默认jsonparams.put("key",APPKEY);//你申请的keytry{result =net(url, params, "GET");JSONObject object = JSONObject.fromObject(result);if(object.getInt("error_code")==0){System.out.println(object.get("result"));}else{System.out.println(object.get("error_code")+":"+object. get("reason"));}} catch(Exception e) {e.printStackTrace();}}//3.身份证挂失查询public static void getRequest3(){String result =null;String url ="/idcard/loss";//请求接口地址Map params = new HashMap();//请求参数params.put("cardno","");//身份证号码params.put("dtype","");//返回数据格式:json或xml,默认jsonparams.put("key",APPKEY);//你申请的keytry{result =net(url, params, "GET");JSONObject object = JSONObject.fromObject(result);if(object.getInt("error_code")==0){System.out.println(object.get("result"));}else{System.out.println(object.get("error_code")+":"+object. get("reason"));}} catch(Exception e) {e.printStackTrace();}}public static void main(String[] args) {}/**** @param strUrl 请求地址* @param params 请求参数* @param method 请求方法* @return 网络请求字符串* @throws Exception*/public static String net(String strUrl, Map params,String method) th rows Exception {HttpURLConnection conn = null;BufferedReader reader = null;String rs = null;try{StringBuffer sb = new StringBuffer();if(method==null|| method.equals("GET")){strUrl = strUrl+"?"+urlencode(params);}URL url = new URL(strUrl);conn = (HttpURLConnection) url.openConnection();if(method==null|| method.equals("GET")){conn.setRequestMethod("GET");}else{conn.setRequestMethod("POST");conn.setDoOutput(true);}conn.setRequestProperty("User-agent", userAgent);conn.setUseCaches(false);conn.setConnectTimeout(DEF_CONN_TIMEOUT);conn.setReadTimeout(DEF_READ_TIMEOUT);conn.setInstanceFollowRedirects(false);conn.connect();if(params!= null&& method.equals("POST")) {try{DataOutputStream out = new DataOutputStream(conn.get OutputStream());out.writeBytes(urlencode(params));} catch(Exception e) {// TODO: handle exception}}InputStream is = conn.getInputStream();reader = new BufferedReader(new InputStreamReader(is, DEF_CH ATSET));String strRead = null;while((strRead = reader.readLine()) != null) {sb.append(strRead);}rs = sb.toString();} catch(IOException e) {e.printStackTrace();} finally{if(reader != null) {reader.close();}if(conn != null) {conn.disconnect();}}return rs;}//将map型转为请求参数型public static String urlencode(Map<String,Object>data) {StringBuilder sb = new StringBuilder();for(Map.Entry i : data.entrySet()) {try{sb.append(i.getKey()).append("=").append(URLEncoder.enc ode(i.getValue()+"","UTF-8")).append("&");} catch(UnsupportedEncodingException e) {e.printStackTrace();}}return sb.toString();}}。

基于ASP.NET的汉字验证码的研究与实现

基于ASP.NET的汉字验证码的研究与实现

基于的汉字验证码的研究与实现随着计算机技术的不断发展,人类社会得以实现了许多原本不可能的事情,例如快速的信息传播、云计算、人工智能等。

但是,对于计算机来说,很多事情却比人类要困难,例如识别图片中的内容。

因此,人们开发了一种叫做验证码的技术,用来防止计算机自动化程序对系统进行攻击。

验证码,即Completely Automated Public Turing test to tell Computers and Humans Apart,全自动区分计算机和人类的图灵测试。

本篇文章将涵盖平台下汉字验证码的研究与实现。

一、汉字验证码的优劣势目前市面上常用的验证码主要有几种:数字验证码、字母验证码、汉字验证码、图形验证码、滑动验证码等。

相比于其他验证码,汉字验证码具有以下优劣势。

优势:1. 难度较高。

数字、字母及图形验证码的实现较为简单,通过简单的算法就能够破解,而汉字验证码的实现难度较大,需要用到一定的自然语言处理算法,因此极大程度上增加了破解难度。

2. 适应性强。

数字、字母验证码在不同文化背景下难以识别,而汉字验证码则在中国文化背景下自然而然地适应到了用户需求。

3. 良好的用户体验。

汉字验证码的图案多样性较大,同时也与中国文化特征相关,能够突显对用户的尊重和重视。

劣势:1. 语境相关。

汉字验证码需要用户对汉字有足够的识别能力,并且还需要对语境有一定的了解,这不可避免地增加了用户的识别难度。

2. 难以扩展。

相比于字母和数字,汉字数量较少,因此汉字验证码难于扩展。

二、汉字验证码的实现汉字验证码的实现需要用到自然语言处理相关的技术,因此对于开发者的技术能力有着较高的要求。

本文将介绍基于平台下汉字验证码的实现步骤。

1. 构建验证码图片首先需要生成汉字验证码的图片。

代码如下:```Bitmap bmp = new Bitmap(width, height);Graphics g = Graphics.FromImage(bmp);g.Clear(Color.White);Random rnd = new Random();// 随机生成四个汉字for (int i = 0; i < 4; i++){char[] chr = new char[1];chr[0] = (char)(rnd.Next(0x4e00, 0x9fa6));string str = new string(chr);PointF point = new PointF(i * 25, 0);g.DrawString(str, font, Brushes.Black, point);}// 添加干扰线for (int i = 0; i < 10; i++){Point p1 = new Point(rnd.Next(width), rnd.Next(height)); Point p2 = new Point(rnd.Next(width), rnd.Next(height)); g.DrawLine(new Pen(Color.Black), p1, p2);}// 添加噪点for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){if (i % 15 == 0 && j % 15 == 0){if (rnd.Next(2) == 0){bmp.SetPixel(i, j, Color.FromArgb(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)));}}}}```2. 将验证码信息存储到Session中为了验证用户输入的验证码是否正确,需要将验证码信息存储到Session中。

C# .NET 身份证操作辅助类

C# .NET 身份证操作辅助类

using System;using System.Data;using System.Text.Regularexxxxxpressions;using System.Windows.Forms;namespace Commons.Format{/// <summary>/// 身份证操作辅助类/// </summary>public class IDCardHelper{private static DataTable dt_IdType;static IDCardHelper(){dt_IdType = new DataTable();dt_IdType.Columns.Add("text");dt_IdType.Columns.Add("value");dt_IdType.Rows.Add(new obxxxxject[] { "居民身份证" "A" });dt_IdType.Rows.Add(new obxxxxject[] { "军官证" "C" });dt_IdType.Rows.Add(new obxxxxject[] { "士兵证" "D" });dt_IdType.Rows.Add(new obxxxxject[] { "军官离退休证" "E" });dt_IdType.Rows.Add(new obxxxxject[] { "境外人员身份证明" "F" }); dt_IdType.Rows.Add(new obxxxxject[] { "外交人员身份证明" "G" }); }/// <summary>/// 绑定身份证类别的名称/// </summary>/// <param name="cb">The cb.</param>public static void InitIdType(ComboBox cb){cb.DataSource = dt_IdType;cb.DisplayMember = "text";cb.ValueMember = "value";cb.DropDownStyle = ComboBoxStyle.DropDownList;}/// <summary>/// 获取身份证类别的名称/// </summary>/// <returns></returns>public static DataTable CreateIDType(){return dt_IdType;}/// <summary>/// 验证身份证结果/// </summary>/// <param name="idcard">身份证号码</param>/// <returns>正确的时候返回string.Empty</returns>public static string Validate(string idcard){if (idcard.Length != 18 && idcard.Length != 15){return "身份证明号码必须是15或者18位!";}Regex rg = new Regex(@"^\d{17}(\d|X)$");if (!rg.Match(idcard).Success){return "身份证号码必须为数字或者X!";}if (idcard.Length == 15){idcard = IdCard15To18(idcard);}else if (idcard.Length == 18){int ll_sum = 0 tmp = 0;for (int i = 0; i < 17; i++){tmp = int.Parse(idcard.Substring(i 1));ll_sum += tmp * li_quan[i];}ll_sum = ll_sum % 11;if (idcard.Substring(17 1) != ls_jy[ll_sum]){return "身份证号码最后一位应该是" + ls_jy[ll_sum] + "!"; }}try{DateTime.Parse(idcard.Substring(6 4) + "-" + idcard.Substring(10 2) + "-" + idcard.Substring(12 2));}catch{return "非法生日";}return string.Empty;}private static string[] ls_jy = { "1" "0" "X" "9" "8" "7" "6" "5" "4" "3" "2" };private static int[] li_quan = { 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1 };/// <summary>/// 15位身份证明号码转化成18位用来编码/// </summary>/// <param name="idcard">15位的身份证号码</param>/// <returns></returns>public static string IdCard15To18(string idcard){/*string ls_jy[] = { "1" "0" "X" "9" "8" "7" "6" "5" "4" "3" "2"} t ls_sfzmhm integer li_quan[] = { 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1}int ll_sum = 0 ils_sfzmhm = mid(sfzmhm 1 6) + '19' + mid(sfzmhm 7)for i = 1 to len(ls_sfzmhm)ll_sum += integer(mid(ls_sfzmhm i 1)) * li_quan[i]nextll_sum = mod(ll_sum 11)ls_sfzmhm += ls_jy[ll_sum + 1]return ls_sfzmhm*/if (idcard == null || idcard.Length != 15){return idcard;}else{string result = string.Empty;int ll_sum = 0 tmp = 0;result = idcard.Substring(0 6) + "19" + idcard.Substring(6 9); for (int i = 0; i < 17; i++){tmp = int.Parse(result.Substring(i 1));ll_sum += tmp * li_quan[i];}ll_sum = ll_sum % 11;result += ls_jy[ll_sum];return result;}}/// <summary>/// 获取身份证对应省份的区划/// </summary>/// <param name="id">身份证</param>/// <returns>头两位+4个0</returns>public static string GetProvince(string id){return id.Substring(0 2) + "0000";}/// <summary>/// 获取身份证对应县市的区划/// </summary>/// <param name="id">身份证</param>/// <returns>头4位+2个0</returns>public static string GetCity(string id){return id.Substring(0 4) + "00";}/// <summary>/// 获取身份证对应地区的区划/// </summary>/// <param name="id">身份证</param>/// <returns>头6位</returns>public static string GetArea(string id){return id.Substring(0 6);}/// <summary>/// 根据身份证判断是否男女/// </summary>/// <param name="id">身份证号码</param>/// <returns>返回"男"或者"女"</returns>public static string GetSexName(string id){int sexStr = 0;if (id.Length == 15){sexStr = Convert.ToInt32(id.Substring(14 1));}else if (id.Length == 18){sexStr = Convert.ToInt32(id.Substring(16 1));}else{throw new ArgumentException("身份证号码不是15或者18位!"); }return sexStr % 2 == 0 ? "女" : "男";}/// <summary>/// 根据身份证获取出生年月/// </summary>/// <param name="id">身份证号码</param>/// <returns>出生年月</returns>public static DateTime GetBirthday(string id){string result = string.Empty;if (id.Length == 15){result = "19" + id.Substring(6 2) + "-" + id.Substring(8 2) + "-" + id.Substring(10 2); }else if (id.Length == 18){result = id.Substring(6 4) + "-" + id.Substring(10 2) + "-" + id.Substring(12 2);}else{throw new ArgumentException("身份证号码不是15或者18位!");}return Convert.ToDateTime(result);}}}。

身份证号码验证方法

身份证号码验证方法

身份证号码验证方法************************** 身份证号码验证方法**************************PARAMETERS SFZCLEARCLOSE TABLES**oldgzq=select()LOCAL RQ,XB,ZFZHSFZ=*******************"XB="男"SFZH=""*----身份证号码位数验证IF !INLIST(LEN(SFZ),15,18)MESSAGEBOX("身份证号码位数不够",64,"系统信息")RETURNENDIF*----统一位数为17位IF LEN(SFZH)=15SFZH=STUFF(SFZ,7,0,"19") &&补足17位ELSESFZH=LEFT(SFZ,17)ENDIF*----出生日期"月"初查IF !BETWEEN(VAL(SUBSTR(SFZH,11,2)),1,12)MESSAGEBOX("身份证号码出生日期【月】代码超出范围",64,"系统信息")RETURNENDIF*----出生日期"日"初查IF !BETWEEN(VAL(SUBSTR(SFZH,13,2)),1,31)MESSAGEBOX("身份证号码出生日期【日】代码超出范围",64,"系统信息")RETURNENDIFRQ=DATE(VAL(SUBSTR(SFZH,7,4)),VAL(SUBSTR(SFZH,11,2)), VAL(SUBSTR(SFZH,13,2))) &&转换为出生日期*----身份证发放地代码验证(前6位数字)USE QHDM ALIAS QHDM &&行政区划代码表LOCATE FOR 区划代码==LEFT(SFZH,6)IF !FOUND()MESSAGEBOX("未查到该身份证发放地代码",64,"系统信息")RETURNELSENAME3=ALLTRIM(区划名称)LOCATE FOR LEFT(区划代码,2)==LEFT(SFZH,2) AND RIGHT(区划代码,4)="0000"NAME1=ALLTRIM(区划名称)LOCATE FOR LEFT(区划代码,4)==LEFT(SFZH,4) AND RIGHT(区划代码,2)="00"NAME2=ALLTRIM(区划名称)MESSAGEBOX("该身份证发放地为【"+NAME1+NAME2+NAME3+"】",64,"系统信息")ENDIF*----身份证出生年验证IF !INLIST(SUBSTR(SFZH,7,2),"19","20")MESSAGEBOX("身份证号码出生日期【年】代码错误",64,"系统信息")RETURNENDIF*----身份证出生月验证IF !BETWEEN(VAL(SUBSTR(SFZH,11,2)),1,12)MESSAGEBOX("身份证号码出生日期【月】代码错误",64,"系统信息")RETURNENDIF*----身份证出生日验证IF !BETWEEN(VAL(SUBSTR(SFZH,13,2)),1,DAY(GOMONTH(R Q-DAY(RQ)+1,1)-1))MESSAGEBOX("身份证号码出生日期【日】代码错误",64,"系统信息")RETURNENDIF*----性别验证IF !INLIST(MOD(VAL(SUBSTR(SFZH,17,1)),2),IIF(XB="男",1,0)) MESSAGEBOX("身份证【性别】代码与实际情况不符",64,"系统信息")RETURNENDIF*----第18位校验码验证J="79A584216379A5842" && A="10"* Y值:012345678910校验码="10X98765432"NSTR=0IF LEN(SFZ)=18FOR I=1 TO LEN(SFZ)-1NSTR=NSTR+VAL(SUBSTR(SFZ,I,1))*VAL(IIF(SUBSTR(J,I,1)== "A","10",SUBSTR(J,I,1)))ENDFORIF RIGHT(SFZ,1)==SUBSTR(校验码,MOD(NSTR,11)+1,1)MESSAGEBOX("第18位校验码为【"+SUBSTR(校验码,MOD(NSTR,11)+1,1)+"】,与身份证校验码相符",64,"系统信息") ELSEMESSAGEBOX("第18位校验码为【"+SUBSTR(校验码,MOD(NSTR,11)+1,1)+"】,与身份证校验码不相符",64,"系统信息") ENDIFENDIF。

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

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

.net实现中国身份证号码验证源码using System;////// Summary descr ip tion for IDCardValid///public cl as s IDCardValid{public IDCardValid(){//// TODO: Add constructor logic here//}////// 验证身份证号码////// 身份证号码/// 验证成功为True,否则为Falsepublic 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,否则为Falseprivate 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,否则为Falseprivate static bool CheckIDCard15(string Id){long n = 0;if (long.TryParse(Id, out n) == false || n <1Math.Pow(10, 14)){return false;//数字验证}string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";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){&nbsp; return false;//生日验证}return true;//符合15位身份证标准}#endregion}2。

身份证号码验证

身份证号码验证

身份证号码验证做过人事的朋友都知道新人入职时会登记很多的资料,特别是遇到表单填写不完整或字迹不工整时给人事的朋友增加了一定的工作难度。

今天分享一个关于身份证号码验证的神器,当录入身份证号码后可以带出籍贯,性别,出生年月以及性别。

这样即使入职人员字迹再不工整也能带出较完整的资料了。

当然还可以做更多的事情。

首先创建一个窗体。

在窗体上建立一些标签和文本框。

然后在窗体输入身份证号的文本框afterupdate事件中写如下代码:If Nz(Me.txtIDNumber) = '' ThenExit Sub'验证输入的是否为一个有效的身份证号码If Not IsIDNumber(Nz(Me.txtIDNumber)) ThenMsgBox '无效的身份证号码!', vbInformationMe.txtIDNumber = NullMe.txtBirthday = NullMe.txtSex = NullMe.txtNativePlace = NullMe.txtAge = NullElse'从表中取得籍贯Me.txtNativePlace =DLookup('[FAddress]', 'tblNativePlaceList','[FNumber]=' & Left(Me.txtIDNumber, 6)) '提取出生日期(第7-14位)Me.txtBirthday =DateSerial(Mid(Me.txtIDNumber, 7, 4), Mid(Me.txtIDNumber, 11, 2),Mid(Me.txtIDNumber, 13, 2))'提取性别(第17位,奇数为男,偶数为女)Me.txtSex = IIf(Mid(Me.txtIDNumber, 17,1) Mod 2 = 0, '女','男')'根据出生日期计算年龄,精确到年Me.txtAge = DateDiff('yyyy',Me.txtBirthday, Date)'根据出生日期计算年龄,精确到月Me.txtAge = DateDiff('m',Me.txtBirthday, Date) \ 12'根据出生日期计算年龄,精确到天Me.txtAge = DateDiff('d',Me.txtBirthday, Date) \ 365.25End If最后运行窗体后再输入身份证号码时相关资料就都出来了,如下效果图:此时也许有朋友要说了,那我随便输入17位或18位的身份证号码行不行呢,当然不行的,不符合身份证号码规则的都不可以。

  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。

相关文档
最新文档