`
ralphr
  • 浏览: 143549 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

中国大陆的身份证检验算法,以及15位和18位身份证的相互转换

    博客分类:
  • web
阅读更多


import java.util.regex.*;
/**
* 中国大陆的身份证检验算法,以及15位和18位身份证的相互转换。
* @author hutz
*
*/
public class IdCardUtil {

    public IdCardUtil(){

    }

    /**
     * 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
     * @param idCard,15位的有效身份证号码
     * @return idCard18 返回18位的有效身份证
     */
    public String IdCard15to18(String idCard){
        idCard = idCard.trim();
        StringBuffer idCard18 = new StringBuffer(idCard);
        //加权因子
        //int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        //校验码值
        char[] checkBit = {'1','0','X','9','8','7','6','5','4','3','2'};
        int sum = 0;
        //15位的身份证
        if(idCard != null && idCard.length()==15){
            idCard18.insert(6, "19");
            for(int index=0;index<idCard18.length();index++){
                char c = idCard18.charAt(index);
                int ai = Integer.parseInt(new Character(c).toString());
                //sum = sum+ai*weight[index];
                //加权因子的算法
                int Wi = ((int)Math.pow(2, idCard18.length()-index))%11;
                sum = sum+ai*Wi;
            }
            int indexOfCheckBit = sum%11; //取模
            idCard18.append(checkBit[indexOfCheckBit]);
        }

        return idCard18.toString();
    }

    /**
     * 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
     * @param idCard 18位身份证号码
     * @return idCard15
     */
    public String IdCard18to15(String idCard){
        idCard = idCard.trim();
        StringBuffer idCard15 = new StringBuffer(idCard);
        if(idCard!=null && idCard.length()==18){
            idCard15.delete(17, 18);
            idCard15.delete(6, 8);
        }
        return idCard15.toString();

    }

    /**
     * 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
     * @param idCart
     * @return
     */
    public boolean checkIDCard(String idCard){
        boolean isIDCard = false;
        Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
        Matcher matcher = pattern.matcher(idCard);
        if(matcher.matches()){//可能是一个身份证
            isIDCard = true;
            if(idCard.length()==18){//如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
                String IdCard15 = IdCard18to15(idCard);
                String IdCard18 = IdCard15to18(IdCard15);
                if(!idCard.equals(IdCard18)){
                    isIDCard = false;
                }
            }else if(idCard.length()==15){
                isIDCard = true;
            }else{
                isIDCard = false;
            }
        }

        return isIDCard;
    }


    public static void main(String[] args){

        IdCardUtil u = new IdCardUtil();
        String idCard = "420106810304041";
        //idCard = "420106810304041";
        //u.IdCard15to18(idCard);
        //u.IdCart18to15(idCart);
        boolean flag = u.checkIDCard(idCard);
        System.out.println(idCard + " : " + flag);
    }

}

分享到:
评论

相关推荐

    python版身份证识别算法

    要深入学习和使用这个Python身份证识别算法,你需要具备Python编程基础,了解OpenCV、PIL等图像处理库,以及对OCR原理和技术有一定的理解。此外,解决Windows环境下运行问题需要对操作系统和库的依赖管理有一定经验...

    matlab 身份证识别算法

    1. **图像预处理**:这是所有图像处理任务的第一步,包括图像去噪(如使用高斯滤波或中值滤波)、二值化(将图像转化为黑白两色,便于后续处理)和边缘检测(如Canny算法或Sobel算子)。预处理的目的是优化图像质量...

    非理想身份证图像的字符分割算法研究

    身份证图像的字符分割算法是图像处理和模式识别领域中的一个重要问题。由于身份证图像往往包含较多的噪声、对比度不一、倾斜等问题,传统的图像处理方法在处理这些问题时常常显得力不从心,无法有效识别出图像中的...

    VB做的18位身份证号码真伪校验程序.rar

    标题中的“VB做的18位身份证号码真伪校验程序”指的是使用Visual Basic(VB)编程语言开发的一个软件工具,其主要功能是验证18位中国居民身份证号码的正确性和合法性。在中国,18位身份证号码是每个公民的唯一标识,...

    js验证身份证格式

    4. **校验码**:是对前17位数字经过特定算法计算得出的一个数字,用于检验身份证号码的正确性。 在JavaScript中,验证身份证号码通常涉及以下步骤: 1. **长度检查**:检查输入的身份证号码长度,必须是15位或18位...

    ASP源码—身份证归属地查询与身份证位数检验程序 v2.5.zip

    首先,身份证位数检验是通过特定的算法来验证输入的身份证号码是否符合中国大陆居民身份证的格式。身份证号码共18位,分为六个部分:地区码、出生日期码、顺序码和校验码。ASP程序会根据这些规则进行校验,例如检查...

    Excel中身份证号码检验函数

    在中国,18位身份证号码由行政区划代码、出生日期、性别标识和校验码四部分组成。每个部分都有特定的编码规则,例如前6位代表地区代码,7到14位是出生年月日,15位是性别(奇数为男性,偶数为女性),最后一位是校验...

    基于API的 "中国身份证计算验证"

    4. **校验码**:第18位是校验码,用于检验整个身份证号码的正确性,通过一种复杂的算法计算得出。 这个VB程序可能实现的功能包括: - **计算最后一位校验码**:根据前17位数字,通过“加权模11除法”的算法计算出...

    公民身份证号码检测。。

    在GB11643-1999标准实施之前,存在15位的身份证号码,而18位号码则是在原有15位的基础上增加了出生年份的完整四位数以及校验码。对于15位号码转为18位号码的方法如下: 1. **添加出生年份**:将15位号码的第7-8位...

    C++中身份证号码验证代码

    校验码是根据前17位数字通过特定算法计算得出的,用于检验身份证号码的正确性。 在`checkID.cpp`文件中,程序可能会包含以下几个关键步骤: 1. **数据输入**:首先,程序需要获取用户的输入,这通常通过`std::cin`...

    IDCardOCR_China, 基于tesseract,实现摄像头扫描识别中国二代身份证.zip

    此外,为了确保身份证的准确性,可能还需要进行边缘检测和图像定位,以确保身份证在图像中的位置和方向正确。 接下来是OCR识别阶段。Tesseract会将预处理后的图像转换为文本输出。对于中文字符的识别,Tesseract...

    js身份证号的验证真伪和地区

    从给定的文件标题、描述、标签以及部分内容来看,该文件提供了一个JavaScript脚本,用于验证中国居民身份证号码的真伪,并能够识别其对应的地区。下面将详细解析这一知识点。 ### 一、身份证号码结构与验证规则 ...

    身份证号里获取出生年月

    1. **兼容性问题**:考虑到15位和18位身份证号码的区别,在处理时需特别注意年份的转换。 2. **数据验证**:在实际应用中,应增加对身份证号码的验证逻辑,确保输入的身份证号码格式正确且有效。 3. **隐私保护**:...

    android原生离线身份证识别Demo(无需网络、无识别次数限制)

    3. 文本区域检测:通过特定的检测算法(如边缘检测、连通组件分析)找到身份证上的文字区域。 4. 文字识别:将检测到的每个文字区域输入到预训练的OCR模型中,模型会输出对应的文字。 5. 结果展示:将识别出的文字...

    基于深度学习身份证鉴别与信息检测方法研究.pdf

    深度学习中的检测算法是本研究的核心,它能够处理复杂的图像识别问题。深度学习算法通过模仿人类大脑的神经网络结构,可以学习和提取数据的特征,实现高效准确的图像和文本信息识别。 #### 3. 残差网络(ResNet) ...

    Python-CardOcr身份证识别OCR

    此外,图像定位也是重要环节,可能需要用到模板匹配或边缘检测算法找到身份证的位置。 在实际应用中,CardOcr项目可能包括以下步骤: 1. 图像读取:使用OpenCV读取身份证图片。 2. 预处理:对图像进行灰度化、二值...

    **基于opencv库和tess-two在android平台上实现身份证号的识别!**

    5. **结果验证**:考虑到身份证号码有特定的格式,识别出的结果需要验证其是否符合中国居民身份证号码的规则,例如18位,前6位代表地区代码,第7到14位代表出生日期,第15到17位代表顺序码,第18位是校验码。...

    js 身份证号验证程序

    中国居民身份证号码由18位数字组成,其中前17位为数字,最后一位为校验码,可能是数字或字母“X”。具体结构如下: 1. **前六位**:地区代码,表示持证人常住户口所在地区的行政区划代码。 2. **第7至14位**:出生...

    基于Qt和opencv的身份证号码识别系统

    【基于Qt和OpenCV的身份证号码识别系统】 在信息技术领域,身份证号码的自动识别具有广泛的应用价值,例如在公共服务、银行、保险等行业的身份验证环节。本文将详细讲解如何利用Qt和OpenCV这两个强大的工具来构建一...

    一段身份证校验的原程序

    对于Delphi的身份证校验,开发者可能使用内置的字符串处理函数,如`Copy`来截取身份证号的各个部分,`StrToDateTime`将出生日期码转换为日期对象进行校验,以及自定义的算法或查找表来计算校验码。此外,程序可能还...

Global site tag (gtag.js) - Google Analytics