算法描述
引用内容:
根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。
15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年前出生的人不适用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
∑(ai×Wi)(mod 11)……………………………………(1)
公式(1)中:
i----表示号码字符从右至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2的(n-1)次方 mod 11计算得出。
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
ai 3 4 0 5 2 4 1 9 8 0 0 1 0 1 0 0 1 a1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1
ai×Wi 21 36 0 25 16 16 2 9 48 0 0 9 0 5 0 0 2 a1
根据公式(1)进行计算:
∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189
189 ÷ 11 = 17 + 2/11
∑(ai×Wi)(mod 11) = 2
然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
a[0]*7+a[1]*9+a[2]*10+a[3]*5+a[4]*8+a[5]*4+a[6]*2+a[7]*1+a[8]*6+a[9]*3
+a[10]*7+a[11]*9+a[12]*10+a[13]*5+a[14]*8+a[15]*4+a[16]*2
java类:
public class CardConverter {
private static final String BIRTH_YEAR = "19";
private static final int[] WI = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10,
5, 8, 4, 2, 1 };
/**
* 18转15
* @param strCard18
* @return
*/
public static String convert18to15(String strCard18) {
if (strCard18 == null || strCard18.length() != 18) {
return strCard18;
}
String strCard15 = strCard18.substring(0, 6)
+ strCard18.substring(8, 17);
return strCard15;
}
/**
* 15转18
* @param strCard15
* @return
*/
public static String convert15to18(String strCard15) {
return convert15to18(strCard15, null);
}
/**
* 15转18
* @param strCard15
* @param strYear
* @return
*/
public static String convert15to18(String strCard15, String strYear) {
if (strCard15 == null || strCard15.length() != 15) {
return strCard15;
}
String year = BIRTH_YEAR;
if (strYear != null && strYear.length() == 2) {
year = strYear;
}
// 17位号
String strCard17 = strCard15.substring(0, 6) + year
+ strCard15.substring(6);
return strCard17 + getLastNumber(strCard17);
}
/**
* 获得最后一位
* @param strCard17
* @return
*/
private static String getLastNumber(String strCard17) {
String str18 = null;
int iNum = 0;
for (int i = 0; i < 17; i++) {
iNum += Integer.parseInt(strCard17.substring(i, i + 1)) * WI[i];
}
iNum = iNum % 11;
switch (iNum) {
case 0:
str18 = "1";
break;
case 1:
str18 = "0";
break;
case 2:
str18 = "X";
break;
case 3:
str18 = "9";
break;
case 4:
str18 = "8";
break;
case 5:
str18 = "7";
break;
case 6:
str18 = "6";
break;
case 7:
str18 = "5";
break;
case 8:
str18 = "4";
break;
case 9:
str18 = "3";
break;
case 10:
str18 = "2";
break;
}
return str18;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
System.out.println(CardConverter.convert18to15("310113198407291234"));
System.out.println(CardConverter.convert15to18("310113840729123","20"));
System.out.println("测试性能:");
long begin = System.currentTimeMillis();
int count = 100000;
for (int i = 0; i < count; i++) {
CardConverter.convert15to18("310113840729123");
}
long end = System.currentTimeMillis();
System.out.println(end - begin);
}
}
js方法:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>js:15位转18位身份证</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
/*
@card 15位身份证
@year 出生年份如19 默认为19
*/
function cid15To18(card,year) {
if(!card || card.length != 15){
return "";
};
var year = year?year:"19";
var fisrt17 = card.substring(0,6)+year+card.substring(6);
return fisrt17 + getLastNum(fisrt17);
}
/**
根据前17位身份证获得第18位
*/
function getLastNum(fisrt17) {
var lastNumber;
var id = fisrt17
var getNum=eval(id.charAt(0)*7+id.charAt(1)*9+id.charAt(2)*10+id.charAt(3)*5+id.charAt(4)*8+id.charAt(5)*4+id.charAt(6)*2+id.charAt(7)*1+id.charAt(8)*6+id.charAt(9)*3+id.charAt(10)*7+id.charAt(11)*9+id.charAt(12)*10+id.charAt(13)*5+id.charAt(14)*8+id.charAt(15)*4+id.charAt(16)*2);
getNum=getNum%11;
switch (getNum) {
case 0 :
lastNumber="1";
break;
case 1 :
lastNumber="0";
break;
case 2 :
lastNumber="X";
break;
case 3 :
lastNumber="9";
break;
case 4 :
lastNumber="8";
break;
case 5 :
lastNumber="7";
break;
case 6 :
lastNumber="6";
break;
case 7 :
lastNumber="5";
break;
case 8 :
lastNumber="4";
break;
case 9 :
lastNumber="3";
break;
case 10 :
lastNumber="2";
break;
}
return lastNumber;
}
function $(id) {
return document.getElementById(id);
}
function convert(value){
var rValue = cid15To18(value);
if(rValue == "") {
alert("身份证格式不正确,必须为15位身份证");
} else {
$("txtCard18").value = rValue;
}
}
//-->
</SCRIPT>
请输入15位身份证<input id="txtCard15" type="text" /><input type="button" value="转换" onclick="convert($('txtCard15').value)"/>
<br/>
18位身份证<input id="txtCard18" type="text" onclick=""/>
</BODY>
</HTML>
分享到:
相关推荐
1. 编写Java类:创建一个Java类,包含身份证转换的函数,例如`convertID15to18`和`convertID18to15`。这些函数应该能够接收15位或18位身份证号码作为参数,并返回转换后的结果。 2. 编译Java类:在Oracle数据库环境...
学号与身份证文件名随意转换.学号与身份证文件名随意转换.学号与身份证文件名随意转换.
通过这些公式,你可以轻松地从身份证号码中提取出生日期并将其转换为Excel可识别的日期格式。这在处理大量涉及身份证号码的数据时非常实用,例如统计不同年龄组的人数或者计算员工的工龄等。记住,使用公式时确保...
"精伦身份证阅读器核查名单转换工具操作说明" 精伦身份证阅读器核查名单转换工具操作说明是指使用精伦 IDR 身份证阅读器核查名单转换工具将行业的核查名单txt文件转换为iDR400 所需格式的核查名单文件的操作步骤。...
6. **类和对象设计**:为了封装身份证号的处理逻辑,我们可以创建一个`PersonNo`类,包含身份证号字段和相关的方法,如获取年龄和地点。这体现了面向对象编程的原则,使代码更易于理解和维护。 7. **校验码验证**:...
本文将详细讲解基于Qt4开发的旧版身份证号转换程序,该程序的主要功能是将15位身份证号码转换为包含世纪信息的18位号码。这个项目对于学习Qt编程和理解身份证号码转换逻辑的人来说非常有价值。 首先,让我们从Qt4...
标题中的“身份证验证颜色值转换asp.net源码”暗示了这是一个使用ASP.NET开发的身份验证程序,其中包含了将身份证号码与特定颜色值关联的功能。在描述中提到,此程序能够处理15位和18位的身份证号码,并且指出身份证...
### Java实现的身份证号码校验类详解 #### 一、引言 身份证号码是中国公民的唯一标识符,具有很高的安全性和唯一性。在中国大陆地区,身份证号码由18位数字组成,其中最后一位用于校验整个身份证号码的有效性。...
总之,ASP身份证生日识别功能是通过解析身份证号码并转换为日期对象实现的,这需要对ASP的内置函数、字符串操作以及日期处理有深入的理解。这个功能可以应用于各种需要验证或显示用户生日的场景,如在线注册、会员...
公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景必备神器。公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景...
首先,我们来看身份证号码检查类的设计。一个标准的身份证号码类通常包含以下方法: 1. **构造函数**:初始化类的属性,可能包括设置默认的验证规则或配置。 2. **validateId**:这是核心的验证方法,用于检查输入...
本主题主要探讨如何利用FME来创建一个自定义转换器,专门用于验证身份证号码的合法性。 身份证号码在中国是个人身份的重要标识,由18位数字组成,包含了出生日期、性别、地区代码等信息。在GIS数据处理中,确保...
这些信息可以通过读卡器读取,并由API转换为可处理的数据格式。 3. **驱动文件**: `WltRS.dll`和`sdtapi.dll`是驱动程序文件,它们是实现VBA与身份证读卡器通信的关键。这些动态链接库文件包含了必要的函数和指令...
因此,提取出生日期的关键就是从身份证号码字符串中正确截取中间8位并转换成日期格式。 在C#中,我们可以使用以下步骤来实现这个功能: 1. 定义一个函数,接收身份证号码作为输入参数。例如: ```csharp public ...
在Java中,你可以创建一个简单的类来解析身份证号码并提取这些信息: ```java public class IdCardInfo { private String idCard; private String province; private String city; private String district; ...
这个工具是专门针对身份证信息处理的软件,它能够帮助用户将身份证信息转换成可读格式,便于管理和分析。下载完成后,找到下载的压缩包文件"USB身份证阅读器安装软件",使用解压工具(如WinRAR或7-Zip)将其解压到一...
在IT行业中,身份证图片文字转换是一项常见的需求,特别是在自动化数据录入、信息验证或者数据分析的场景下。本示例主要展示了如何使用.NET框架下的C#语言,结合Tesseract-OCR(Optical Character Recognition,光学...
"18位身份证号码转换成出生日期的函数公式归类" 在这个函数公式中,我们可以看到的是18位身份证号码转换成出生日期的公式归类,包括身份证号码的性别判断、出生日期提取和年龄计算等信息。 首先,我们需要判断...
它通过射频技术读取身份证芯片中的数据,并将其转换为可读格式。在C#中,我们可以利用.NET Framework提供的SerialPort类或者特定的硬件驱动库来与阅读器建立通信,接收并解析这些数据。 身份证阅读器封装类的实现...