ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:21.46KB ,
资源ID:7567290      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7567290.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(身份证号码编排规则及校验位C语言C#语言Java语言实现.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

身份证号码编排规则及校验位C语言C#语言Java语言实现.docx

1、身份证号码编排规则及校验位C语言C#语言Java语言实现身份证号码编排规则及校验位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 p18位的身份证号d

3、ddddd yyyymmdd xx p y其中dddddd为地址码(省地县三级)18位中的和15位中的不完全相同yyyymmdd yymmdd 为出生年月日xx顺号类编码p性别18位中末尾的y为校验码,将前17位的ascii码值经位移、异或运算结果不在0-9的令其为x18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999公民身份号码中做了明确规定。GB11643-1999公民身份号码为GB11643-1989社会保障号码的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999公民身份号码从实施之日起代替GB11643-1

4、989。公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。校验的计算方式:1. 对前17位数字本体码加权求和公式为:S =

5、 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 22. 以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语言实现校验:#include #include #include #include /C语言实现国民身份证号校验int IsDigitBuf(char *sBuf,

6、int nLen) 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; switch (iMonth) case 1: case 3: case 5: case 7: case 8: case 10: case 12: if (i

7、Day 31) return -3; break; case 4: case 6: case 9: case 11: if (iDay 30) return -3; break; 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; return 0;int CheckStrDate(char *sDate) int iRet; char sYear5; cha

8、r sMonth3; char sDay3; memset(sYear, 0, sizeof(sYear); memset(sMonth, 0, sizeof(sMonth); memset(sDay, 0, sizeof(sDay); if (strlen(sDate) != 8) return -1; memcpy(sYear, sDate, 4); memcpy(sMonth, sDate+4, 2); memcpy(sDay, sDate+6, 2); iRet = checkdate(atoi(sYear), atoi(sMonth), atoi(sDay); if (iRet !=

9、 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 if (strle

10、n(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

11、(FAILn); exit(1); /* 身份证18位校验位是否有效 */ for (i = 0; i 17; i +) memset(sDate, 0, sizeof(sDate); sDate0 = sIdCardNoi; iDate = atoi(sDate); Sum += iWeighti * iDate; Sum %= 11; if (x = sIdCardNo17) sIdCardNo17 = X; if (cCheckSum != sIdCardNo17) printf(FAILn); exit(1); printf(OKn); exit(0); 2.Java语言实现校验:pa

12、ckagecom.haier.hmms.util;importjava.text.SimpleDateFormat;importjava.util.Date;/*验证身份证号码身份证号码,可以解析身份证号码的各个字段,以及验证身份证号码是否有效;身份证号码构成:6位地址编码+8位生日+3位顺序码+1位校验码*ClassName:CheckIdCard*Description:TODO*authorsuncy*date2013-1-4上午11:06:09*/publicclassCheckIdCardprivateStringcardNumber;/完整的身份证号码 privateBoolean

13、cacheValidateResult=null;/缓存身份证是否有效,因为验证有效性使用频繁且计算复杂 privateDatecacheBirthDate=null;/缓存出生日期,因为出生日期使用频繁且计算复杂 privatefinalstaticStringBIRTH_DATE_FORMAT=yyyyMMdd;/身份证号码中的出生日期的格式 privatefinalstaticDateMINIMAL_BIRTH_DATE=newDate(-2209017600000L);/身份证的最小出生日期,1900年1月1日 privatefinalstaticintNEW_CARD_NUMBER_

14、LENGTH=18;privatefinalstaticintOLD_CARD_NUMBER_LENGTH=15;privatefinalstaticcharVERIFY_CODE=1,0,X,9,8,7,6,5,4,3,2;/18位身份证中最后一位校验码 privatefinalstaticintVERIFY_CODE_WEIGHT=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;/18位身份证中,各个数字的生成校验码时的权值 publicbooleanvalidate()if(null=cacheValidateResult)booleanresult=true;r

15、esult=result&(null!=cardNumber);/身份证号不能为空 result=result&NEW_CARD_NUMBER_LENGTH=cardNumber.length();/身份证号长度是18(新证) /身份证号的前17位必须是阿拉伯数字 for(inti=0;result&i=0&ch=9;/身份证号的第18位校验正确 result=result&(calculateVerifyCode(cardNumber)=cardNumber.charAt(NEW_CARD_NUMBER_LENGTH-1);/出生日期不能晚于当前时间,并且不能早于1900年 tryDateb

16、irthDate=this.getBirthDate();result=result&null!=birthDate;result=result&birthDate.before(newDate();result=result&birthDate.after(MINIMAL_BIRTH_DATE);/*出生日期中的年、月、日必须正确,比如月份范围是1,12,日期范围是1,31,还需要校验闰年、大月、小月的情况时,*月份和日期相符合*/StringbirthdayPart=this.getBirthDayPart();StringrealBirthdayPart=this.createBirth

17、DateParser().format(birthDate);result=result&(birthdayPart.equals(realBirthdayPart);catch(Exceptione)result=false;cacheValidateResult=Boolean.valueOf(result);/TODO /完整身份证号码的省市县区检验规则 returncacheValidateResult;/*如果是15位身份证号码,则自动转换为18位*paramcardNumber*return*/publicCheckIdCard(StringcardNumber)if(null!=

18、cardNumber)cardNumber=cardNumber.trim();if(OLD_CARD_NUMBER_LENGTH=cardNumber.length()cardNumber=contertToNewCardNumber(cardNumber);this.cardNumber=cardNumber;publicStringgetCardNumber()returncardNumber;publicStringgetAddressCode()this.checkIfValid();returnthis.cardNumber.substring(0,6);publicDateget

19、BirthDate()if(null=this.cacheBirthDate)trythis.cacheBirthDate=this.createBirthDateParser().parse(this.getBirthDayPart();catch(Exceptione)thrownewRuntimeException(身份证的出生日期无效);returnnewDate(this.cacheBirthDate.getTime();publicbooleanisMale()return1=this.getGenderCode();publicbooleanisFemal()returnfals

20、e=this.isMale();/*获取身份证的第17位,奇数为男性,偶数为女性*return*/privateintgetGenderCode()this.checkIfValid();chargenderCode=this.cardNumber.charAt(NEW_CARD_NUMBER_LENGTH-2);return(int)(genderCode-0)&0x1);privateStringgetBirthDayPart()returnthis.cardNumber.substring(6,14);privateSimpleDateFormatcreateBirthDateParse

21、r()returnnewSimpleDateFormat(BIRTH_DATE_FORMAT);privatevoidcheckIfValid()if(false=this.validate()thrownewRuntimeException(身份证号码不正确!);/*校验码(第十八位数):*十七位数字本体码加权求和公式S=Sum(Ai*Wi),i=0.16,先对前17位数字的权求和;*Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi:791058421637910584*2;计算模Y=mod(S,11)通过模得到对应的校验码Y:012345678910校验码:10X9

22、*8765432*paramcardNumber*return*/privatestaticcharcalculateVerifyCode(CharSequencecardNumber)intsum=0;for(inti=0;iNEW_CARD_NUMBER_LENGTH-1;i+)charch=cardNumber.charAt(i);sum+=(int)(ch-0)*VERIFY_CODE_WEIGHTi;returnVERIFY_CODEsum%11;/*把15位身份证号码转换到18位身份证号码*15位身份证号码与18位身份证号码的区别为:*1、15位身份证号码中,出生年份字段是2位,转

23、换时需要补入19,表示20世纪*2、15位身份证无最后一位校验码。18位身份证中,校验码根据根据前17位生成*paramcardNumber*return*/privatestaticStringcontertToNewCardNumber(StringoldCardNumber)StringBuilderbuf=newStringBuilder(NEW_CARD_NUMBER_LENGTH);buf.append(oldCardNumber.substring(0,6);buf.append(19);buf.append(oldCardNumber.substring(6);buf.appe

24、nd(CheckIdCard.calculateVerifyCode(buf);returnbuf.toString();3.C#语言实现校验:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace 测试四 public partial class Form1 : Form public Form1() InitializeComponent(); private void btnLook_Click(object sender, EventArgs e) /身份证目前可分为15位和18位 /15位号码组成:省(2)市(2)区/县(2)年(

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1