[转帖]中华人民共和国居民身份证15与18规则算法
根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的<BR>规定,公民身份号码是特征组合码,由十七位数字本码和一位数字校验<BR>码组成。排列顺序从左至右依次为:六位数字地址区位码,八位数字出<BR>生日期码,三位数字顺序码和一位数字校验码。<BR><BR>地址区位码:表示居民常住户口所在县(市、区)的行政区划代码。<BR><BR>出生日期码:表示居民出生的年、月、日,其中年份用四位数字表示,<BR>年、月、日之间不用分隔符。<BR><BR>数字顺序码:表示同一地址区位码所标识的区域范围内,对同年同月同<BR>日出生的人员编定的顺序号。奇数分给男性,偶数分给女性。<BR><BR>数字校验码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校<BR>验码计算出来的检验码。由(1,2,3,4,5,6,7,8,9,X)构成。<BR><BR>下面举例说明该计算方法并用代码实现。<BR><BR>公式:Ax=(∑(Ai×Wi))(mod 11)…………………………(1)<BR><BR>i----表示身份证号码字符从右至左包括校验码在内的位置序号;<BR>Ai----表示第i位置上的数字号码;<BR>Ax----数字校验码的值;<BR>Wi----示第i位置上的加权因子;<BR>公式:Wi=(2^(i-1))(mod 11)…………………………(2)<BR><BR>设某男性公民身份号码为51310119820113001,首先得到各个变量:<BR><BR>i18 17 16 15 14 13 12 11 10 987654321<BR><BR>Ai51310119820113001Ax<BR>由公式(2)可得:<BR>Wi7910 58421637910 58421<BR><BR>Ai×Wi35 930 5042948 60910 15 002A1<BR><BR>按照公式(1)计算:<BR><BR>∑(Ai×Wi)=(35+9+30+5+0+4+2+9+48+6+0+9+10+15+0+0+2)=184<BR>184÷11=16+8/11<BR>∑(Ai×Wi)(mod 11)=8<BR><BR>然后根据计算的结果,从下表中查出相应的校验码,X表示结果为10:<BR><BR>∑(Ai×WI)(mod 11)0 1 2 3 4 5 6 7 8 9 10<BR>校验码字符值Ai1 0 X 9 8 7 6 5 4 3 2<BR><BR>根据上面的方法,查出计算结果为8的校验码为4所以该人员的公民身份<BR>号码应该为513101198201130014。 <BR><BR>以下是我在PB 8.0中实现的代码(在窗口上放置两个SingleLineEdit控件和一个CommandButton控件)<BR><BR>//sle_1:旧的身份证号码<BR>//sle_2:旧的身份证号码<BR>long Ai=0<BR>string code,old_id<BR>int i<BR>old_id=trim(sle_1.text)<BR>for i=17 to 1 step -1<BR>Ai=Ai+(long(mid(old_id,i,1)))*(mod(2^((18)-i),11))<BR>next<BR>choose case mod(Ai,11)<BR>case 0<BR>code='1'<BR>case 1<BR>code='0'<BR>case 2<BR>code='X'<BR>case else<BR>code=string((12)-mod(Ai,11))<BR>end choose<BR>sle_2.text=old_id+code 谢谢 不错不错<br> <p>好,正到处找呢!</p>
页:
[1]