发布时间: 2012-08-29 08:40:14 作者: rapoo
身份证验证之校验码算法验证
import java.util.Calendar;import java.util.Scanner;public class ValidateID {// 记录信息private String info = "地区:";public static void main(String[] args) { System.out.println("输入身份证号码:"); Scanner sc = new Scanner(System.in); String id = sc.nextLine(); new ValidateID().validateLastNum(id);}/* * 关于身份证号码最后一位的校验码的算法如下: ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., 18 ) "*" : * 表示乘号 i: 表示身份证号码每一位的序号,从右至左,最左侧为18,最右侧为1。 a[i]: 表示身份证号码第 i 位上的号码 W[i]: 表示第 * i 位上的权值 W[i] = 2^(i-1) mod 11 设:R = ∑(a[i]*W[i]) mod 11 ( i = 2, 3, ..., * 18 ) C = 身份证号码的校验码 则R和C之间的对应关系如下表: R:0 1 2 3 4 5 6 7 8 9 10 C:1 0 X 9 8 7 * 6 5 4 3 2 由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。 */public boolean validateLastNum(String strId) {// 判断身份证是否为18位if (strId.length() != 18) {return false;}// 把String转换为StringBuffer是为了用到reverse()方法StringBuffer sb = new StringBuffer(strId);// 字符串反转sb.reverse();// 转回来,便于操作String id = new String(sb);// 如果含有非数字,则直接返回false退出try {Long.parseLong(id);} catch (Exception e) {// System.out.println("该字符串只能是数字");return false;}// 下面算法遵照上面的公式int sum = 0;int C = 0;int[] W = new int[17];int[] a = new int[17];for (int i = 2; i < 19; i++) {W[i - 2] = (int) (Math.pow(2, i - 1) % 11);a[i - 2] = Integer.parseInt(id.substring(i - 1, i));sum += (a[i - 2] * W[i - 2]);}int R = sum % 11;// 将上面得到的结果,根据R:C对应关系,做如下转换if (R == 0) {C = 1;}if (R == 1) {C = 0;}if (R == 2) {C = 10;}if (R > 2) {C = 12 - R;}// 截取第一个字符,即转换前的最后一个字符String lastChar = id.substring(0, 1);// 将截取的字符转换成数字int lastNum = Integer.parseInt(lastChar);// 判断身份证的最后个字符和计算得到的数据做比较,如果相等则正确,反之错误if (lastNum != C) {// 由于R=2对应C=10,而10在身份证中用X表示,所以可通过验证下面两个条件是否同时满足来判断if (C == 10 && lastChar.equals("X")) {// System.out.println("身份证通过校验码验证");return true;}// System.out.println("身份证未能通过校验码验证");return false;}// System.out.println("身份证通过校验码验证");return true;}}
JAVA基础-java中ET的差异
ByteBuffer跟String的互相转换
vim 编辑器的三种模式怎么切换
电脑编码
地图reduce编程模型介绍
Java基础java缓存读写资料小例子
学习jar下令 创建和解压jar文件包
java生成随机数、四舍五入、当前时间的
[猖獗Java讲义精粹] 第十一章|多线程
Java Thread 小结