2022年身份证号码编排规则及校验位C语言、C#语言、Java语言实现实用 .pdf
《2022年身份证号码编排规则及校验位C语言、C#语言、Java语言实现实用 .pdf》由会员分享,可在线阅读,更多相关《2022年身份证号码编排规则及校验位C语言、C#语言、Java语言实现实用 .pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、身份证号码编排规则及校验位C 语言、C#语言、Java 语言实现/校验身份证号,如果正确返回 true 如果错误返回 false/身份证目前可分为 15位和18位/15 位号码组成:省(2)市(2)区/县(2)年(2)月(2)日(2)+序列号(3)奇数分配给男性偶数分配给女性/15 位升级到 18位:出生年都加上 19,第二点:第十八位为校验位,也就是说第十八位要从前 17位计算而来/如果是 15位数字,那么我们就取得 17,8 位时出生年/如果是 18 位,则先校验用户输入的身份证是否合法,如果合法者去 7-10 位为出生年身份证号码中这些数字是怎样排列的,每个数字表示什么意思呢?下面就让我
2、们一起来探索其中的规律吧!新的身份证号码是由18 位数字组成的,它们分别表示:(1)前 1、2 位数字表示:所在省份的代码;(2)第 3、4 位数字表示:所在城市的代码;(3)第 5、6 位数字表示:所在区县的代码;(4)第 714 位数字表示:出生年、月、日;(5)第 15、16 位数字表示:所在地的派出所的代码;(6)第 17 位数字表示性别:奇数表示男性,偶数表示女性;(7)第 18 位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是09 的数字,有时也用x 表示。15 位的身份证号dddddd yymmdd xx p 18 位的身份证号
3、dddddd yyyymmdd xx p y 其中 dddddd 为地址码(省地县三级)18 位中的和 15 位中的不完全相同yyyymmdd yymmdd 为出生年月日xx 顺号类编码p 性别18 位中末尾的 y 为校验码,将前 17 位的 ascii 码值经位移、异或运算结果不在名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 19 页 -0-9 的令其为 x 18 位身 份 证标 准在国 家质 量 技术 监 督局于1999年 7 月 1 日实 施 的GB11643-1999 公民身份号码中做了明确规定。GB11643-1999 公民身份号码为GB11643-1989 社会保障
4、号码的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999 公民身份号码从实施之日起代替GB11643-1989。公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:1.地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T2260 的规定执行。2.出生日期码:表示编码对象出生的年、月、日,按GB/T7408 的规定执行,年、月、日分别用4 位、2 位、2 位数字表示,之间不用分隔符。3.顺序码:表示在同一地址码所标识的
5、区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。校验的计算方式:1.对前 17 位数字本体码加权求和公式为:S=Sum(Ai*Wi),i=0,.,16 其中 Ai 表示第 i 位置上的身份证号码数字值,Wi 表示第 i 位置上的加权因子,其各位对应的值依次为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.以 11 对计算结果取模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 21.C 语言实现校验:#in
6、clude#include#include#include /C 语言实现国民身份证号校验int IsDigitBuf(char*sBuf,int nLen)名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 19 页 -int i;if(nLen=0)return 1;if(nLen strlen(sBuf)nLen=strlen(sBuf);for(i=0;i nLen;i+)if(!isdigit(sBufi)return 0;return 1;int checkdate(int iYear,int iMonth,int iDay)if(iYear 9999)return-1;
7、switch(iMonth)case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(iDay 31)return-3;break;case 4:case 6:case 9:case 11:if(iDay 30)return-3;break;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 19 页 -case 2:if(iYear%4=0&iYear%100!=0)|iYear%400=0)if(iDay 29)return-3;else if(iDay 28)return-3;break;default:return-2;ret
8、urn 0;int CheckStrDate(char*sDate)int iRet;char sYear5;char sMonth3;char sDay3;memset(sYear,0,sizeof(sYear);memset(sMonth,0,sizeof(sMonth);memset(sDay,0,sizeof(sDay);if(strlen(sDate)!=8)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 19 页 -return-1;memcpy(sYear,sDate,4);memcpy(sMonth,sDate+4,2);memcpy(sDay,sDate+6,2
9、);iRet=checkdate(atoi(sYear),atoi(sMonth),atoi(sDay);if(iRet!=0)return-1;return 0;int main(int argc,char*argv)int i;int iRet;int iWeight18=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1;char cCheck11=1,0,X,9,8,7,6,5,4,3,2;char sIdCardNo20;char sDate8+1;int iDate;int Sum=0;if(argc 0)printf(OKn);exit(0);else i
10、f(strlen(sIdCardNo)!=18)printf(FAILn);exit(1);/*身份证 7-14位是否有效*/memset(sDate,0,sizeof(sDate);memcpy(sDate,sIdCardNo+6,4);iDate=atoi(sDate);if(iDate 2020)printf(FAILn);exit(1);memset(sDate,0,sizeof(sDate);memcpy(sDate,sIdCardNo+6,8);iRet=CheckStrDate(sDate);if(iRet 0)printf(FAILn);exit(1);/*身份证 18位校验位
11、是否有效*/for(i=0;i 17;i+)memset(sDate,0,sizeof(sDate);sDate0=sIdCardNoi;iDate=atoi(sDate);Sum+=iWeighti*iDate;Sum%=11;if(x=sIdCardNo17)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 19 页 -sIdCardNo17=X;if(cCheckSum!=sIdCardNo17)printf(FAILn);exit(1);printf(OKn);exit(0);2.Java语言实现校验:package com.haier.hmms.util;import j
12、ava.text.SimpleDateFormat;import java.util.Date;/*验证身份证号码身份证号码,可以解析身份证号码的各个字段,以及验证身份证号码是否有效;身份证号码构成:6 位地址编码+8 位生日+3 位顺序码+1 位校验码*ClassName:CheckIdCard *Description:TODO *author suncy *date 2013-1-4 上午 11:06:09 */名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 19 页 -public class CheckIdCard private String cardNumber;/
13、完整的身份证号码 private Boolean cacheValidateResult=null;/缓存身份证是否有效,因为验证有效性使用频繁且计算复杂 private Date cacheBirthDate=null;/缓存出生日期,因为出生日期使用频繁且计算复杂 private final static String BIRTH_DATE_FORMAT=yyyyMMdd;/身份证号码中的出生日期的格式 private final static Date MINIMAL_BIRTH_DATE=new Date(-2209017600000L);/身份证的最小出生日期,1900 年 1 月
14、1 日 private final static int NEW_CARD_NUMBER_LENGTH=18;private final static int OLD_CARD_NUMBER_LENGTH=15;private final static char VERIFY_CODE=1,0,X,9,8,7,6,5,4,3,2;/18位身份证中最后一位校验码 private final static int VERIFY_CODE_WEIGHT=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;/18 位身份证中,各个数字的生成校验码时的权值 public boolea
15、n validate()if(null=cacheValidateResult)boolean result=true;result=result&(null!=cardNumber);/身份证号不能为空 result=result&NEW_CARD_NUMBER_LENGTH=cardNumber.length();/身份证号长度是 18(新证)名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 19 页 -/身份证号的前 17 位必须是阿拉伯数字 for(int i=0;result&i=0&ch=9;/身份证号的第 18 位校验正确 result=result&(calcula
16、teVerifyCode(cardNumber)=cardNumber .charAt(NEW_CARD_NUMBER_LENGTH-1);/出生日期不能晚于当前时间,并且不能早于1900 年 try Date birthDate=this.getBirthDate();result=result&null!=birthDate;result=result&birthDate.before(new Date();result=result&birthDate.after(MINIMAL_BIRTH_DATE);/*出生日期中的年、月、日必须正确,比如月份范围是 1,12,日期范围是 1,31,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年身份证号码编排规则及校验位C语言、C#语言、Java语言实现实用 2022 身份证号码 编排 规则 校验位 语言 C# Java 实现 实用
限制150内