`

C#实现的18位身份证号码最新算法[验证部分]

阅读更多

private void btnVerification_Click(object sender, EventArgs e)
{
Regex reg = new Regex(@"^\d{17}(\d|X)");
string sTemp=tbVerification.Text;
lbCardInfo.Items.Clear();
if (sTemp == string.Empty)
{
MessageBox.Show("没有输入任何身份证号码","请注意",MessageBoxButtons.OK,MessageBoxIcon.Warning);
return;
}
if (sTemp.Length != 18)
{
MessageBox.Show("输入身份证号码的长度应为18位", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (reg.Matches(sTemp).Count==0)
{
MessageBox.Show("输入身份证号码的格式有误", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

if (!isDiscValid(sTemp.Substring(0,6)))
{
MessageBox.Show("输入的身份证号码行政区划代码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

if (!isBirthValid(sTemp.Substring(6, 8)))
{
MessageBox.Show("输入的身份证号码出生日期无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
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)))
{
MessageBox.Show("输入的身份证号码性别顺序码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
else
{
lbCardInfo.Items.Add("性别:"+((Convert.ToInt32(sTemp.Substring(14, 3)) % 2==0) ? "女" : "男"));
}

if (!isParityValid(sTemp))
{
MessageBox.Show("输入的身份证号码验证码无效", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
lbCardInfo.Items.Insert(0, "身份证号:" + sTemp);
lbCardInfo.Items.Insert(0, "验证解读信息:");
lbCardInfo.Items.Add("完成验证!");
gbCardInfo.Visible = true;
}

#region
private void GetDiscInfo(string sFilenName)
{
if (File.Exists(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
{
MessageBox.Show("文件{0}不存在!", "请注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}

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;
}

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();
}

//iSex=0 男
private List<string> GenRnd(int iSex)
{
Random rd=new Random();
List<string> sTemp = new List<string>();
int i=0;
while(i<maxNum)
{
int rndNum = rd.Next(0,1000);
if(rndNum % 2 == iSex)rndNum++;
if (rndNum >= 1000) continue;
string s3=rndNum.ToString().PadLeft(3,'0');
if(!sTemp.Contains(s3))
{
sTemp.Add(s3);
i++;
}
}
return sTemp;
}

private List<string> GetID()
{
List<string> tempID = new List<string>();
List<string> sexRndNum = GenRnd(rbMan.Checked?0:1);
string str18 = string.Empty;
for (int i = 0; i < maxNum; i++)
{
string str17=string.Empty;
string sCity = cbCities.SelectedValue.ToString();
string sYMD=dtpBirth.Value.Year.ToString() + dtpBirth.Value.Month.ToString().PadLeft(2, '0') + dtpBirth.Value.Day.ToString().PadLeft(2, '0');
str17=sCity+sYMD+sexRndNum[i];
str18 = str17 + GenParityBit(str17);
tempID.Add(str18);
}
return tempID;
}

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 (clsAdministrativeDivisionsCode caac in cityCode)
{
if (caac.AdCode == s.Substring(0, 4) + "00")
{

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

lbCardInfo.Items.Add("地区名称:" + cadc.AdName.TrimStart());
iFlag = true;
break;
}
}
return iFlag;
}

private bool isBirthValid(string s)
{
string sYear = s.Substring(0, 4);
string sMonth = s.Substring(4, 2);
string sDay = s.Substring(6, 2);
DateTime dt;
if (DateTime.TryParse(string.Format("{0}-{1}-{2}", sYear, sMonth, sDay), out dt))
{
if (dt > DateTime.Now)
return false;
else
return true;
}
else
return false;

}

private bool isSexValid(string s)
{
return s == "000" ? false : true;
}

private bool isParityValid(string s18)
{
int[] Weight = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
string Parity = "10X98765432";
string s17 = s18.Substring(0, 17);
int s = 0;
for (int i = 0; i < s17.Length; i++)
{
s += Int32.Parse(s17[i].ToString()) * Weight[i];
}
return Parity[s % 11].ToString() == s18.Substring(17, 1) ? true : false;
}

#endregion

界面演示如下:

ID INTERFACE

这里是主要的验证部分,如有需要全部源代码的,请在评论中留下你的E-MAIL。

分享到:
评论

相关推荐

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

    此代码实现了对18位身份证号码的验证,包括检查号码格式、省份代码有效性、出生日期格式及校验码准确性,最后返回验证结果和身份证号码的部分信息,如省份、出生日期和性别。 #### 结论 通过以上分析和代码实现,...

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

    首先,18位身份证号码的结构分为三部分:6位地址码、8位出生日期码和最后4位顺序码(含性别校验码)。地址码代表了持证人的户籍所在地,出生日期码则直接对应了出生年月日,顺序码用于区分在同一日出生的人,最后一...

    C#身份证验证器

    中国的居民身份证号码共18位,分为6个部分:地区码(前6位)、出生日期码(7-14位)、顺序码(15-17位,奇数表示男性,偶数表示女性)、校验码(最后一位)。校验码是通过特定算法计算得出,确保了身份证号码的唯一...

    C#实现身份证号码校验

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

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

    在提供的代码片段中,定义了两个方法`CheckIDCard15`和`CheckIDCard18`来分别验证15位和18位身份证号码的有效性。具体实现包括: - 长度检查。 - 地区码有效性检查,通过查找地址字符串中的子串实现。 - 生日日期的...

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

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

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

    在提供的压缩包文件"身份证号码算法"中,可能包含了用于计算校验码的算法代码示例。学习并理解这段代码可以帮助你更好地实现身份证号码验证功能。 总的来说,验证身份证号码合法性是通过一系列的逻辑检查和数学计算...

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

    在这个示例中,`CheckIDCard18`方法用于验证18位身份证号码,`CheckIDCard15`方法则首先将15位号码转换为18位,然后进行验证。注意,对于15位身份证号码,通常假定出生年份为1900年后,因此在中间插入"19",最后的...

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

    根据提供的信息,我们可以详细解析与C#中国身份证验证相关的知识...以上代码实现了对18位身份证号码的省份验证和校验码验证,确保号码符合GB11643-1999标准。通过这种方式,可以有效地验证身份证号码的有效性和合法性。

    身份证号码验证的代码

    首先,中国居民身份证号码共18位,分为6个部分:前6位代表行政区划代码,第7到14位为出生日期码(格式为YYYYMMDD),第15到17位为顺序码(奇数分配给男性,偶数分配给女性),最后一位是校验码。校验码可能是0到9中...

    验证身份证号码.rar

    本压缩包文件"验证身份证号码.rar"可能包含相关的代码示例、算法说明或者教程资料,帮助我们理解和实现身份证号码的验证功能。 身份证号码的结构分为三部分:地址码、出生日期码和顺序码,以及最后一位的校验码。...

    一个关于身份证号码验证程序

    总之,身份证号码验证程序是对个人身份信息的一种重要验证手段,它依赖于对身份证号码编码规则的理解和有效的算法实现。理解并编写这样的程序有助于提高对数据验证和处理的技能,同时也能增强对个人隐私保护的意识。

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

    2. 后端:编写验证逻辑代码,实现身份证号码的各个部分验证功能。 3. 数据交互:前端和后端通过事件驱动进行数据交互,如点击“验证”按钮触发后台验证函数。 4. 错误处理:设置异常处理机制,对可能出现的错误进行...

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

    4. **校验码验证**:最后一位是校验码,根据前17位数字通过特定算法计算得出,用于检测身份证号码输入的准确性。验证器会重新计算这个校验码并与输入的校验码进行对比,确认其是否一致。 这个C#源代码可能包含了...

    C#版身份证验证源码

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

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

    中国的身份证号码由18位数字组成,分为三个部分:前6位代表地区代码,接着的8位是出生日期,最后的4位是顺序号和校验码。顺序号中,奇数分配给男性,偶数分配给女性。第18位是校验码,用于验证身份证号码的正确性。 ...

    身份证验证器.zip

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

    C# 源码 判断 身份证号 有效性

    C# 源码 判断 身份证号 有效性 包含:长度 校验位 出生日期 省份 等判断算法

Global site tag (gtag.js) - Google Analytics