1、身份证验证问题,2015-3,Management Information System,问题,1.如何验证一个身份证号码是否是真的?2.从身份证号码中能获得什么样的信息?3.如何用程序来解决这两个问题?,问题分析,1.号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:6位数字地址码8位数字出生日期码3位数字顺序码1位数字校验码。例如:,3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 X,地址码,出生日期码,顺序码,校验码,问题分析,1.地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2、2.出生日期码表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。3.顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。4.校验码校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。,校验码计算方法,某男性公民身份号码本体码为34052419800101001,首先按照公式计算:(AiWi)(mod 11)(1)公式(1)中: i-表示号码字符从右至左包括校验码在内的位置序号; Ai-表示第i位置上的号码字符值; Wi-示第i位置上的加
3、权因子,其数值依据公式Wi=2(n-1) % 11计算得出。,校验码计算方法,189 /11 = 17 2mod(AiWi) , 11) = 2然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:根据上表,查出计算结果为2的校验码为X,所以该人员的公民身份号码应该为 34052419800101001X。,地址码处理问题,地址码所对应的地址放在地址码文件中,程序设计流程图,开始,输入身份证号码,验证,验证结果,提取身份证信息,输出身份信息,结束,输出错误提示,程序,static void Main(string args) string IDNumber; /待检验的身
4、份证号码18位 string strAreaCode; /1-6位 区域代码 string strBirthday; /7-14位 出生日期码 string strSerialNumber; /15-17位 顺序码,奇数为男,偶数为女 char strVerifyCode; /第18位 校验位 Console.WriteLine(请输入一个身份证号码:); IDNumber= Console.ReadLine();,/验证长度是否正确,if (IDNumber.Length != 18) Console.WriteLine(身份证长度不够!n); Console.ReadKey(); /程序暂
5、停 return; Console.WriteLine(IDNumber);,/验证校验码是否正确,strVerifyCode = char.Parse(IDNumber.Substring(17, 1); /原身份证中的验证码int ch = new int17; /身份证的前17个字符int weight = new int 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 ; /验证身份证号码的权值char verifyCode = new char 1, 0, x, 9, 8, 7, 6, 5, 4, 3, 2 ;/对应的验证码int sum = 0;for (i
6、nt i = 0; i 17; i+) chi = int.Parse(IDNumber.Substring(i, 1); sum += chi*weighti; int result = sum % 11; /校验位置 if (verifyCoderesult != strVerifyCode) /校验码验证 Console.WriteLine(验证码不正确!n); Console.ReadKey(); /程序暂停 return; ,/输出身份信息,/输出地区 /输出出生日期和年龄 /输出性别,思考(问题和改进),1. 日期验证的问题2. 地区码验证问题3. 程序结构问题(重用,可读,健壮),Thank you!,