博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#身份证号码校验
阅读量:4323 次
发布时间:2019-06-06

本文共 2706 字,大约阅读时间需要 9 分钟。

 

C#实现的18位身份证格式验证算法 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:

一、范围

该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。

二、编码对象

公民身份号码的编码对象是具有中华人民共和国国籍的公民。

三、号码的结构和表示形式

1、号码的结构

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

2、地址码

表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。

3、出生日期码

表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。

4、顺序码

表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

5、校验码

(1)十七位数字本体码加权求和公式

S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和

Ai:表示第i位置上的身份证号码数字值

Wi:表示第i位置上的加权因子

Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

 

ExpandedBlockStart.gif
代码
private
 
string
 CheckCidInfo(
string
 cid)
    {
        
string
[] aCity 
=
 
new
 
string
[] { 
null
null
null
null
null
null
null
null
null
null
null
"
北京
"
"
天津
"
"
河北
"
"
山西
"
"
内蒙古
"
null
null
null
null
null
"
辽宁
"
"
吉林
"
"
黑龙江
"
null
null
null
null
null
null
null
"
上海
"
"
江苏
"
"
浙江
"
"
安微
"
"
福建
"
"
江西
"
"
山东
"
null
null
null
"
河南
"
"
湖北
"
"
湖南
"
"
广东
"
"
广西
"
"
海南
"
null
null
null
"
重庆
"
"
四川
"
"
贵州
"
"
云南
"
"
西藏
"
null
null
null
null
null
null
"
陕西
"
"
甘肃
"
"
青海
"
"
宁夏
"
"xinjiang
"
null
null
null
null
null
"
台湾
"
null
null
null
null
null
null
null
null
null
"
香港
"
"
澳门
"
null
null
null
null
null
null
null
null
"
国外
"
 };
        
double
 iSum 
=
 
0
;
        
string
 info 
=
 
""
;
        System.Text.RegularExpressions.Regex rg 
=
 
new
 System.Text.RegularExpressions.Regex(
@"
^\d{17}(\d|x)$
"
);
        System.Text.RegularExpressions.Match mc 
=
 rg.Match(cid);
        
if
 (
!
mc.Success)
        {
            
return
 
""
;
        }
        cid 
=
 cid.ToLower();
        cid 
=
 cid.Replace(
"
x
"
"
a
"
);
        
if
 (aCity[
int
.Parse(cid.Substring(
0
2
))] 
==
 
null
)
        {
            
return
 
"
非法地区
"
;
        }
        
try
        {
            DateTime.Parse(cid.Substring(
6
4
+
 
"
-
"
 
+
 cid.Substring(
10
2
+
 
"
-
"
 
+
 cid.Substring(
12
2
));
        }
        
catch
        {
            
return
 
"
非法生日
"
;
        }
        
for
 (
int
 i 
=
 
17
; i 
>=
 
0
; i
--
)
        {
            iSum 
+=
 (System.Math.Pow(
2
, i) 
%
 
11
*
 
int
.Parse(cid[
17
 
-
 i].ToString(), System.Globalization.NumberStyles.HexNumber);
        }
        
if
 (iSum 
%
 
11
 
!=
 
1
)
            
return
 (
"
非法证号
"
);
        
return
 (aCity[
int
.Parse(cid.Substring(
0
2
))] 
+
 
"
,
"
 
+
 cid.Substring(
6
4
+
 
"
-
"
 
+
 cid.Substring(
10
2
+
 
"
-
"
 
+
 cid.Substring(
12
2
+
 
"
,
"
 
+
 (
int
.Parse(cid.Substring(
16
1
)) 
%
 
2
 
==
 
1
 
?
 
"
"
 : 
"
"
));
    }

 

(2)计算模

Y = mod(S, 11)

(3)通过模得到对应的校验码

Y: 0 1 2 3 4 5 6 7 8 9 10

校验码: 1 0 X 9 8 7 6 5 4 3 2

四、举例如下:

北京市朝阳区: 11010519491231002X

广东省汕头市: 440524188001010014

 

 

转载于:https://www.cnblogs.com/hendy/archive/2010/04/29/1723891.html

你可能感兴趣的文章
Kaldi中的Chain模型
查看>>
spring中的ResourceBundleMessageSource使用和测试示例
查看>>
css规范 - bem
查看>>
电梯调度程序的UI设计
查看>>
转自 zera php中extends和implements的区别
查看>>
Array.of使用实例
查看>>
【Luogu】P2498拯救小云公主(spfa)
查看>>
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
[Hive - LanguageManual] Alter Table/Partition/Column
查看>>
可持久化数组
查看>>
去除IDEA报黄色/灰色的重复代码的下划波浪线
查看>>
Linux发送qq、网易邮件服务配置
查看>>
几道面试题
查看>>
【转】使用 WebGL 进行 3D 开发,第 1 部分: WebGL 简介
查看>>
js用正则表达式控制价格输入
查看>>
chromium浏览器开发系列第三篇:chromium源码目录结构
查看>>
java开发操作系统内核:由实模式进入保护模式之32位寻址
查看>>