`

C#实现的18位身份证格式验证算法[详细版]

阅读更多

项目分析

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1026" style="WIDTH: 335.25pt; HEIGHT: 378pt" type="#_x0000_t75"><imagedata o:title="正面" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.jpg"></imagedata></shape>

<shape id="_x0000_i1027" style="WIDTH: 213pt; HEIGHT: 29.25pt" type="#_x0000_t75"><imagedata o:title="组件" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.jpg"></imagedata></shape>

第一部分生成号码

代码概述

1.事件:void frmAlgorithm_Load(object sender, EventArgs e)

描述:首先,在窗体加载时,调用"void GetDiscInfo(string sFilenName)"读取"DiscInfo.txt"中的信息,然后在"cbProvince"中显示读取的信息(使用了外设组件"bsProvince")

2.事件: void cbProvince_SelectedIndexChanged(object sender, EventArgs e)

描述:在选择省份时,调用"List<clsAdministrativeDivisionsCode> GetSomeCodes(string sCondition)""cbCities"中显示省份的下属市或县(使用了外设组件"bsCity")

----------------核心代码-↓↓↓------------------------------------

3.事件: void btnGenID_Click(object sender, EventArgs e)

描述: 方法1:"List<string> GetID()" //生成14位数号码,并返回18位数号码

方法2: "List<string> GenRnd(int iSex)" //返回3位数的顺序码

方法3: "string GenParityBit(string s17)" //返回1位数的校验码

根据选择好的生日和性别生成号码.首先调用方法1.在方法1中调用了方法2和方法3,方法2返回3位数的顺序码,方法3返回1位数的校验码.方法1自身生成14位数号码+3位顺序码+1位校验码=18位号码,返回给外设组件"bsID",然后显示.

----------------核心代码-↑↑↑---------------------------------------

源代码

class clsAdministrativeDivisionsCode

{

private string adCode;

private string adName;

public clsAdministrativeDivisionsCode(string code, string name)

{ adCode = code; adName = name; }

public string AdCode

{

get { return adCode; }

set { adCode = value; }

}

public string AdName

{

get { return adName; }

set { adName = value; }

}

}// class clsAdministrativeDivisionsCode

public class frmAlgorithm : Form

{

private int maxNum = 500;

List<clsAdministrativeDivisionsCode> provinceCode = new List<clsAdministrativeDivisionsCode>();

List<clsAdministrativeDivisionsCode> cityCode = new List<clsAdministrativeDivisionsCode>();

List<string> ID = new List<string>();

private void frmAlgorithm_Load(object sender, EventArgs e)

{

GetDiscInfo("DiscInfo.txt");

bsProvince.DataSource = provinceCode;

cbProvince.DataSource = bsProvince;

cbProvince.DisplayMember = "AdName";

cbProvince.ValueMember = "AdCode";

cbProvince.SelectedIndex = -1; //引发cbProvince_SelectedIndexChanged事件

lblMsg.Text = @"请在文本框中输入位有效身份证号,验证通过后方可解读。";

}//void frmAlgorithm_Load

private void GetDiscInfo(string sFilenName)

{

using (StreamReader sr = new StreamReader(Environment.CurrentDirectory + @"\" + sFilenName, Encoding.Default)) {

string sLine = string.Empty;

Regex re = new Regex(@"[\s]{1,}", RegexOptions.Compiled); //指定至少匹配个空白字符,程序集

while (!sr.EndOfStream) { //如果流不在末尾,则循环

sLine = sr.ReadLine();

sLine = re.Replace(sLine, " ");

string[] sTemp = sLine.Split(new char[] { ' ' });

if (sTemp[0].EndsWith("0000")) {

provinceCode.Add(new clsAdministrativeDivisionsCode(sTemp[0],sTemp[1])); }

else {

if (sTemp[0].EndsWith("00"))

cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0],sTemp[1]));

else

if (sTemp[1].EndsWith("市辖区"))

cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], " " + sTemp[1]));

else

cityCode.Add(new clsAdministrativeDivisionsCode(sTemp[0], " " + sTemp[1]));

}//else

}//while

}//using

}//void GetDiscInfo(string sFilenName)

//事件将在省份列表的选择中被引发

private void cbProvince_SelectedIndexChanged(object sender, EventArgs e)

{

List<clsAdministrativeDivisionsCode> tempCity = new List<clsAdministrativeDivisionsCode>();

if (cbProvince.SelectedValue != null)

{

//调用Substring(0, 2)的目的是:提取公共部分来查找下属市或县

//例如:山西省的省号为140000,则其下属市或县的号码都以14开头

//140101 市辖区 140105 小店区

//140106 迎泽区 140122 阳曲县

tempCity = GetSomeCodes(cbProvince.SelectedValue.ToString().Substring(0, 2));

if (tempCity != null)

{

bsCity.DataSource = tempCity;

cbCities.DataSource = bsCity;

cbCities.DisplayMember = "AdName";

cbCities.ValueMember = "AdCode";//显示信息

}//if

}//if

}//cbProvince_SelectedIndexChanged

private List<clsAdministrativeDivisionsCode> GetSomeCodes(string sCondition)

{

List<clsAdministrativeDivisionsCode> tempCity = new List<clsAdministrativeDivisionsCode>();

foreach (clsAdministrativeDivisionsCode temp in cityCode)

if (sCondition == temp.AdCode.Substring(0, 2))//比较省份号码的公共部分

tempCity.Add(temp);

return tempCity;//返回下属市或县 }//List<clsAdministrativeDivisionsCode> GetSomeCodes(string sCondition)

----------------核心代码-↓↓↓------------------------------------

private void btnGenID_Click(object sender, EventArgs e)

{

//省略一些检查代码

this.Cursor = Cursors.WaitCursor;//把光标设置成沙漏状

bsID.DataSource = GetID(); //获取外设组件bsID的数据源(GetID()获得)

lbID.DataSource = bsID; //显示个身份证号

this.Cursor = Cursors.Default;//还原光标

}//void btnGenID_Click

private List<string> GetID()

{

List<string> tempID = new List<string>();

List<string> sexRndNum = GenRnd(rbMan.Checked?0:1);//单选框''被选中,值为0;否则为1

string str18 = string.Empty;

for (int i = 0; i < maxNum; i++)

{

string str17=string.Empty;

string sCity = cbCities.SelectedValue.ToString();//获取下属市或县的号码,共6

string sYMD=dtpBirth.Value.Year.ToString() +

dtpBirth.Value.Month.ToString().PadLeft(2, '0') +

tpBirth.Value.Day.ToString().PadLeft(2, '0');//获取年月日,共8

str17=sCity+sYMD+sexRndNum[i];//17位的身份证号,还需最后一位校验码

str18 = str17 + GenParityBit(str17);//18位的身份证号

tempID.Add(str18);

}

return tempID;

}//List<string> GetID()

private List<string> GenRnd(int iSex)

{

Random rd = new Random();//随机数对象

List<string> sTemp = new List<string>();

int i = 0;

while (i < maxNum)//maxNum=500;

{

int rndNum = rd.Next(0, 1000); //0<=rndNum<=999

if (rndNum % 2 == iSex) rndNum++;

if (rndNum >= 1000) continue; //if (rndNum == 1000)

string s3 = rndNum.ToString().PadLeft(3, '0');

//右对齐字符串,不满位的,在左边添加'0'填充例:002,054,586

if (!sTemp.Contains(s3))//确保没有重复的号码

{

sTemp.Add(s3);

i++;

}

}//while

return sTemp;

}// List<string> GenRnd(int iSex)

//不知道下面这些数据从哪来是正常的,是根据公式来算的

private string GenParityBit(string s17)

{

int[] Weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

string Parity = "10X98765432";

int s = 0;

for (int i = 0; i < s17.Length; i++)

{

s += Int32.Parse(s17[i].ToString()) * Weight[i];

}

return Parity[s % 11].ToString();//返回校验码

}//string GenParityBit(string s17)

----------------核心代码-↑↑↑---------------------------------------

} //public class frmAlgorithm

验证解读部分

<shape id="_x0000_i1025" style="WIDTH: 273pt; HEIGHT: 306.75pt" type="#_x0000_t75"><imagedata o:title="背面" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image004.jpg"></imagedata></shape>

代码概述

1. 事件: void btnVerification_Click(object sender, EventArgs e)

描述:首先获取输入的身份证号码,然后把它拆分成4,分别是

1) 行政地区码(6),使用"bool isDiscValid(string s)"来验证.

2) 出生日期(7-14),使用" bool isBirthValid(string s)"来验证.

3) 顺序码(15-17),使用"bool isSexValid(string s)"来验证.

4) 校验码(18),使用" bool isParityValid(string s18)"来验证.

源代码

class clsAdministrativeDivisionsCode

{

private void btnVerification_Click(object sender, EventArgs e)

{

//省略提示……

Regex reg = new Regex(@"^\d{17}(\d|X)");//匹配18位数字,最后一位可以是数字或X

string sTemp = tbVerification.Text;

lbCardInfo.Items.Clear();

if (sTemp == string.Empty) { return; }

if (sTemp.Length != 18) { return; }

if (reg.Matches(sTemp).Count == 0) { return; }

if (!isDiscValid(sTemp.Substring(0, 6))) { return; }//验证行政地区码

if (!isBirthValid(sTemp.Substring(6, 8))) { return; }//验证生日

else

lbCardInfo.Items.Add(string.Format("出生日期:{0}{1}{2}", sTemp.Substring(6, 4), sTemp.Substring(10, 2), sTemp.Substring(12, 2)));

if (!isSexValid(sTemp.Substring(14, 3))) { return; }//验证性别

else { lbCardInfo.Items.Add("性别:" + ((Convert.ToInt32(sTemp.Substring(14, 3)) % 2 == 0) ? "" : "")); }

if (!isParityValid(sTemp)) { return; }//验证最后一位校验码

lbCardInfo.Items.Insert(0, "身份证号:" + sTemp);

lbCardInfo.Items.Insert(0, "验证解读信息:");

lbCardInfo.Items.Add("完成验证!");

}//void btnVerification_Click

private bool isDiscValid(string s)

{

bool iFlag = false;

foreach (clsAdministrativeDivisionsCode cadc in cityCode)

{

if (cadc.AdCode == s)

{

string st = s.Substring(0, 2);

foreach (clsAdministrativeDivisionsCode capc in provinceCode)

{

if (capc.AdCode.Substring(0, 2) == st)

{

lbCardInfo.Items.Add("省或直辖市名称:" + capc.AdName);

break;

}

}//foreach

foreach (clsAdministrativeDivisionsCode caac in cityCode)

{

if (caac.AdCode == s.Substring(0, 4) + "00")

{

lbCardInfo.Items.Add("市名称:" + caac.AdName.TrimStart());

break;

}

分享到:
评论

相关推荐

    C#实现的18位身份证格式验证算法

    ### C#实现的18位身份证格式验证算法详解 身份证号码在中国大陆地区是个人身份的重要标识,由18位数字组成,其中包含了个人的出生日期、性别以及户籍所在地等信息。18位身份证号码遵循GB11643-1999标准,该标准在...

    C#实现的18位身份证格式验证算法.doc

    C#实现的18位身份证格式验证算法.doc

    C#实现的18位身份证格式验证源码

    总结来说,C#实现18位身份证格式验证涉及到字符串处理、日期转换以及特定算法的运用。通过编写和理解这样的代码,开发者不仅可以提高对C#特性的掌握,还能增强对数据验证和业务逻辑处理的理解,对于开发涉及个人身份...

    C#身份证验证器

    总的来说,"C#身份证验证器"项目结合了C#的字符串操作、数值计算、错误处理以及数据查询等多方面的知识,为用户提供了一个实用的身份证信息验证工具。通过学习这个项目,开发者不仅可以加深对C#语言的理解,还能了解...

    C#身份证验证.txtC#身份证验证.txtC#身份证验证.txt

    ### C#身份证验证算法解析 #### 身份证结构 身份证号码在中国分为两种格式:15位和18位。 - **15位身份证**:由6位地区码、6位出生日期(YYMMDD)和3位顺序码组成。 - **18位身份证**:由6位地区码、8位出生日期...

    C#身份证验证算法归类.pdf

    【C#身份证验证算法】 身份证验证是用于确认个人身份的重要工具,尤其是在中国,身份证号码是每个公民唯一的法定标识。在C#中实现身份证验证涉及到一系列的算法,这些算法需遵循中国的GB11643-1999标准。本文将深入...

    C#验证身份证是否符合规则

    在实际编写C#代码时,我们可以创建一个方法,接收18位身份证号码作为参数,然后逐个进行上述检查。若所有检查都通过,返回true,否则返回false。此外,为了提高用户体验,可以在每个检查环节提供具体的错误提示,...

    C#中国身份证验证,包括省份验证和校验码验证,符合GB11643-1999标准

    根据提供的信息,我们可以详细解析与C#中国身份证验证相关的知识点,包括省份验证和校验码验证,确保符合GB11643-1999标准。 ### 一、身份证号码结构 中国的身份证号码有两种格式:15位和18位。 #### 15位身份证...

    C#版身份证验证源码

    在C#中实现这些功能,可以创建一个身份证验证类,包含一个验证方法,接受18位身份证号码作为输入参数。通过方法内部的逻辑判断,先进行校验码验证,再解析地区代码、出生日期和性别信息。地区代码可以通过查询预定义...

    C#实现身份证号码校验

    综上所述,实现C#身份证号码校验涉及对身份证号码结构的理解、数学计算、字符串操作以及可能的额外验证。通过以上代码示例,我们可以构建一个全面且准确的身份证号码验证系统,确保在处理用户数据时的准确性与安全性...

    C# 身份证验证器 实例源码(系统操作)

    本文将详细解析如何利用C#来创建一个身份证验证器,并结合提供的"身份证验证器"实例源码进行深入探讨。 首先,我们需要了解中国居民身份证的基本结构和校验规则。中国的身份证号码由18位数字组成,分为6位地址码、8...

    身份证号码验证示例源码2008-4-22

    这个示例源码提供了ASP.NET和C#实现的身份证号码验证功能,可以处理15位和18位的身份证号码,并声称有90%的成功验证率。下面我们将详细探讨身份证号码验证的原理以及该示例源码可能涉及的关键技术。 1. **身份证...

    身份证号真伪识别器 C#开发

    本文将详细解析使用C#语言开发的身份证号真伪识别器的相关知识点,帮助读者深入理解其原理和实现方法。 一、C#编程语言 C#是一种由微软公司开发的面向对象的编程语言,它被广泛用于Windows应用程序开发、Web应用...

    c#系统操作之身份证验证器源码.rar

    这个“c#系统操作之身份证验证器源码.rar”压缩包包含了一个实现这一功能的C#源代码示例。让我们深入探讨一下这个身份证验证器的工作原理和涉及的关键知识点。 首先,身份证验证器的主要目标是检查一个给定的身份证...

    C# 身份证 验证类 DLL 带源码

    7. **身份证验证算法**:在源码中,可能会包含如Luhn算法(也称为模10算法)来计算和验证校验码,或者使用特定的公式来检查地区码和出生日期的合理性。开发者可以通过源码理解这些验证步骤,并根据需要进行调整。 8...

    C#377-身份证验证器源代码

    这个资源"**C#377-身份证验证器源代码**"提供了一个用C#编程语言实现的身份证验证工具,用于检查中国大陆居民身份证的合法性。C#是一种广泛应用于Windows平台开发的.NET框架下的面向对象的编程语言,其语法简洁且...

    身份证验证器.zip

    本项目"身份证验证器.zip"是一个基于C#编程语言开发的身份信息验证工具,它旨在帮助开发者快速实现对中国大陆居民身份证号码的合法性和真实性的检查。下面我们将详细探讨这个工具的相关知识点。 1. **C#编程语言**:...

Global site tag (gtag.js) - Google Analytics