公民身份号码是特征组合码 , 由十七位数字本体码和一位数字校验码组成 . 排列顺序从左至右依次为 : 六位数字地址码 , 八位数字出生日期码 , 三位数字顺序码和一位数字校验码。 1 、地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按 GB/T2260 的规定执行。
   2 、出生日期码表示编码对象出生的年、月、日,按 GB/T7408 的规定执行。年、月、日代码之间不用分隔符。例:某人出生日期为 1966 10 26 日,其出生日期码为 19661026
   3 、顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数千分配给女性。
   4 、校验码校验码采用 ISO7064 1983 MOD11-2 校验码系统。
   1 )十七位数字本体码加权求和公式  S=Sum(Ai*Wi),i=0,...,16 ,先对前 17 位数字的权求和  Ai: 表示第 i 位置上的身份证号码数字值  Wi: 表示第 i 位置上的加权因子  Wi:7910584216379105842
   2 )计算模  Y=mod(S,11)
   3 )通过模得到对应的校验码  :012345678910  验码 :10X98765432
  下面是 java 实现的代码
 
代码: [ 复制到剪贴板 ]
 
/**IDCard.javaCreatedon2004-11-517:03:37**/packageorg.yz21.study.idcard;
   /***@authorviolin2004-11-517:03:37*Copyrightwww.yz21.org2003-2004*/publicclassIDCard{//wi=2(n-1)(mod11)finalint[]wi={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
   //verifydigitfinalint[]vi={1,0,X,9,8,7,6,5,4,3,2};
   privateint[]ai=newint[18];
   publicIDCard(){}
   //verifypublicbooleanVerify(Stringidcard){if(idcard.length()==15){idcard=uptoeighteen(idcard);}if(idcard.length()!=18){returnfalse;}Stringverify=idcard.substring(17,18);if(verify.equals(getVerify(idcard))){returntrue;}returnfalse;}
   //getverifypublicStringgetVerify(Stringeightcardid){intremaining=0;
   if(eightcardid.length()==18){eightcardid=eightcardid.substring(0,17);}
   if(eightcardid.length()==17){intsum=0;for(inti=0;i<17;i++){Stringk=eightcardid.substring(i,i+1);ai=Integer.parseInt(k);}
   for(inti=0;i<17;i++){sum=sum+wi*ai;}remaining=sum%11;}
   returnremaining==2?"X":String.valueOf(vi[remaining]);}
   //15updateto18publicStringuptoeighteen(Stringfifteencardid){Stringeightcardid=fifteencardid.substring(0,6);eightcardid=eightcardid+"19";eightcardid=eightcardid+fifteencardid.substring(6,15);eightcardid=eightcardid+getVerify(eightcardid);returneightcardid;}
   }
  测试代码:使用的单元测试工具是 junit
代码: [ 复制到剪贴板 ]
  



此帖由 Tanya 在 2006-12-11 21:57 进行编辑...
/**IDCardTest.javaCreatedon2004-11-517:32:12**/packageorg.yz21.study.idcard;
   importjunit.framework.Test;importjunit.framework.TestCase;importjunit.framework.TestSuite;
   /***@authorviolin2004-11-517:32:12*Copyrightwww.yz21.org2003-2004*/publicclassIDCardTestextendsTestCase{
   privateStringidcard1="11010519491231002X";privateStringidcard2="440524188001010014";
   publicvoidtestVerify(){IDCardidcard=newIDCard();this.assertTrue(idcard.Verify(idcard1));this.assertTrue(idcard.Verify(idcard2));}
   publicstaticTestsuite(){returnnewTestSuite(IDCardTest.class);}
   publicstaticvoidmain(String[]args){junit.textui.TestRunner.run(suite());}}