身份证号码格式说明及校验码生成方法

一、身份证号码格式说明

1.旧15位身份证号码格式

01-06位:地址码,表示户口所在地行政区代码。
07-12位:出生日期码,表示出生的年、月、日。
13-15位:顺序码,表示同一地址码同年同月同日出生的人员顺序号,奇数分给男性,偶数分给女性。

2.新18位身份证号码格式

01-06位:地址码,表示户口所在地行政区代码。
07-14位:出生日期码,表示出生的年、月、日。
15-17位:顺序码,表示同一地址码同年同月同日出生的人员顺序号,奇数分给男性,偶数分给女性。
18位:校验码。

说明:第01-17位又称本体码,第18位称校验码。

二、身份证号码15位升级到18位方法

出生年份加个19,末尾加个校验码即可。

三、校验码生成方法

1.前17个数字各乘对应加权因子{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2},第1个数字乘7,第2个数字乘9,依此类推;
2.将所有乘积相加求和;
3.将和除11求余数;
4.根据余数从集合{1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2}中得校验码,余数0则集合第一项为校验码,依此类推;

四、C#相关代码

using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        /// <summary>
        /// 生成校验码
        /// </summary>
        /// <param name="idcard"></param>
        /// <returns></returns>
        static string CreateCheckcode(string idcard)
        {
            if (!Regex.IsMatch(idcard, "^\\d+$"))
                throw new ArgumentException("参数必须全为数字.");
            else if (idcard.Length < 17)
                throw new ArgumentException("参数长度必须不应小于17.");
            else
            {
                int[] Wi = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
                string[] lastcode = new string[] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
                idcard = idcard.Substring(0, 17);
                int sum = 0;
                for (int i = 0; i < idcard.Length; i++)
                {
                    sum += int.Parse(idcard[i].ToString()) * Wi[i];
                }

                return lastcode[sum % 11].ToString();
            }
        }

        /// <summary>
        /// 15位升至18位
        /// </summary>
        /// <param name="idcard"></param>
        /// <returns></returns>
        static string CreateNewIDCard(string idcard)
        {
            if (!Regex.IsMatch(idcard, "^\\d{15}$"))
                throw new ArgumentException("参数必须全为15位数字.");
            else
            {
                string str = idcard.Substring(0, 6) + "19" + idcard.Substring(6);
                return str + CreateCheckcode(str);
            }
        }

        /// <summary>
        /// 验证身份证号码
        /// </summary>
        /// <param name="idcard"></param>
        /// <returns></returns>
        static bool CheckIDCard(string idcard)
        {
            if (idcard.Length == 15)
                idcard = CreateNewIDCard(idcard);
            return CreateCheckcode(idcard) == idcard[idcard.Length - 1].ToString();
        }

        static void Main(string[] args)
        {
            string idcard = "350724821114101";
            Console.WriteLine("15位号码:{0}", idcard);
            Console.WriteLine("18位号码:{0}", CreateNewIDCard(idcard));
            Console.WriteLine("格式验证:{0}", CheckIDCard(idcard));

            Console.ReadKey();
        }
    }
}


上一篇: [信息图]移动世界60秒
下一篇: Web流程图绘制的心得
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 0 | 引用: 0 | 查看次数: 9981
发表评论
登录后再发表评论!