C#验证 中国 身份证 代码
生活随笔
收集整理的這篇文章主要介紹了
C#验证 中国 身份证 代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*
???????? * 理論部分:
???????? * 15位身份證號碼=6位地區(qū)代碼+6位生日+3位編號
???????? * 18位身份證號碼=6位地區(qū)代碼+8位生日+3位編號+1位檢驗碼
???????? *
???????? * 各省市地區(qū)國家代碼前兩位代碼是:????
???????? * 北京 11 吉林 22 福建 35 廣東 44 云南 53 天津 12 黑龍江 23 江西 36 廣西 45 西藏 54 河北 13 上海 31 山東 37 海南 46 陜西 61 山西 14 江蘇 32 河南 41 重慶 50
??????? 甘肅 62 內(nèi)蒙古 15 浙江 33 湖北 42 四川 51 青海 63 遼寧 21 安徽 34 湖南 43 貴州 52 寧夏 64 新 疆 65 臺灣 71 香港 81 澳門 82 國外 91?? *18位身份證標(biāo)準(zhǔn)在國家質(zhì)量技術(shù)監(jiān)督局于1999年7月1日實施的GB11643-1999《公民身份號碼》中做了明確規(guī)定。
??????? *GB11643-1999《公民身份號碼》為GB11643-1989《社會保障號碼》的修訂版,其中指出將原標(biāo)準(zhǔn)名稱“社會保障號碼”更名為“公民身份號碼”,另外GB11643-1999《公民身份號碼》從實施之日起代替GB11643-1989。
??????? *公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位校驗碼。其含義如下: *1. 地址碼:表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。
??????? *2. 出生日期碼:表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日分別用4位、2位、2位數(shù)字表示,之間不用分隔符。
??????? *3. 順序碼:表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
??????? *校驗的計算方式: *1. 對前17位數(shù)字本體碼加權(quán)求和
??????? *公式為:S = Sum(Ai * Wi), i = 0, ... , 16
??????? *其中Ai表示第i位置上的身份證號碼數(shù)字值,Wi表示第i位置上的加權(quán)因子,其各位對應(yīng)的值依次為:
??????? *7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
??????? *2. 以11對計算結(jié)果取模
??????? *Y = mod(S, 11) *3. 根據(jù)模的值得到對應(yīng)的校驗碼對應(yīng)關(guān)系為:
??????? *Y值: 0 1 2 3 4 5 6 7 8 9 10
??????? *校驗碼: 1 0 X 9 8 7 6 5 4 3 2
??????? */
??????? 代碼 ?1??///?<summary>
?2?????????///?身份證驗證
?3?????????///?</summary>
?4?????????///?<param?name="Id">身份證號</param>
?5?????????///?<returns></returns>
?6?????????public?bool?CheckIDCard(string?Id)
?7?????????{
?8?????????????if?(Id.Length?==?18)
?9?????????????{
10?????????????????bool?check?=?CheckIDCard18(Id);
11?????????????????return?check;
12?????????????}
13?????????????else?if?(Id.Length?==?15)
14?????????????{
15?????????????????bool?check?=?CheckIDCard15(Id);
16?????????????????return?check;
17?????????????}
18?????????????else
19?????????????{
20?????????????????return?false;
21?????????????}
22?????????}
23?????????///?<summary>
24?????????///?18位身份證驗證
25?????????///?</summary>
26?????????///?<param?name="Id">身份證號</param>
27?????????///?<returns></returns>
28?????????private?bool?CheckIDCard18(string?Id)
29?????????{
30?????????????long?n?=?0;
31?????????????if?(long.TryParse(Id.Remove(17),?out?n)?==?false?||?n?<?Math.Pow(10,?16)?||?long.TryParse(Id.Replace('x',?'0').Replace('X',?'0'),?out?n)?==?false)
32?????????????{
33?????????????????return?false;//數(shù)字驗證
34?????????????}
35?????????????string?address?=?"11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36?????????????if?(address.IndexOf(Id.Remove(2))?==?-1)
37?????????????{
38?????????????????return?false;//省份驗證
39?????????????}
40?????????????string?birth?=?Id.Substring(6,?8).Insert(6,?"-").Insert(4,?"-");
41?????????????DateTime?time?=?new?DateTime();
42?????????????if?(DateTime.TryParse(birth,?out?time)?==?false)
43?????????????{
44?????????????????return?false;//生日驗證
45?????????????}
46?????????????string[]?arrVarifyCode?=?("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47?????????????string[]?Wi?=?("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
48?????????????char[]?Ai?=?Id.Remove(17).ToCharArray();
49?????????????int?sum?=?0;
50?????????????for?(int?i?=?0;?i?<?17;?i++)
51?????????????{
52?????????????????sum?+=?int.Parse(Wi[i])?*?int.Parse(Ai[i].ToString());
53?????????????}
54?????????????int?y?=?-1;
55?????????????Math.DivRem(sum,?11,?out?y);
56?????????????if?(arrVarifyCode[y]?!=?Id.Substring(17,?1).ToLower())
57?????????????{
58?????????????????return?false;//校驗碼驗證
59?????????????}
60?????????????return?true;//符合GB11643-1999標(biāo)準(zhǔn)
61?????????}
62?????????///?<summary>
63?????????///?15位身份證驗證
64?????????///?</summary>
65?????????///?<param?name="Id">身份證號</param>
66?????????///?<returns></returns>
67?????????private?bool?CheckIDCard15(string?Id)
68?????????{
69?????????????long?n?=?0;
70?????????????if?(long.TryParse(Id,?out?n)?==?false?||?n?<?Math.Pow(10,?14))
71?????????????{
72?????????????????return?false;//數(shù)字驗證
73?????????????}
74?????????????string?address?=?"11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75?????????????if?(address.IndexOf(Id.Remove(2))?==?-1)
76?????????????{
77?????????????????return?false;//省份驗證
78?????????????}
79?????????????string?birth?=?Id.Substring(6,?6).Insert(4,?"-").Insert(2,?"-");
80?????????????DateTime?time?=?new?DateTime();
81?????????????if?(DateTime.TryParse(birth,?out?time)?==?false)
82?????????????{
83?????????????????return?false;//生日驗證
84?????????????}
85?????????????return?true;//符合15位身份證標(biāo)準(zhǔn)
86?????????}
???????? * 理論部分:
???????? * 15位身份證號碼=6位地區(qū)代碼+6位生日+3位編號
???????? * 18位身份證號碼=6位地區(qū)代碼+8位生日+3位編號+1位檢驗碼
???????? *
???????? * 各省市地區(qū)國家代碼前兩位代碼是:????
???????? * 北京 11 吉林 22 福建 35 廣東 44 云南 53 天津 12 黑龍江 23 江西 36 廣西 45 西藏 54 河北 13 上海 31 山東 37 海南 46 陜西 61 山西 14 江蘇 32 河南 41 重慶 50
??????? 甘肅 62 內(nèi)蒙古 15 浙江 33 湖北 42 四川 51 青海 63 遼寧 21 安徽 34 湖南 43 貴州 52 寧夏 64 新 疆 65 臺灣 71 香港 81 澳門 82 國外 91?? *18位身份證標(biāo)準(zhǔn)在國家質(zhì)量技術(shù)監(jiān)督局于1999年7月1日實施的GB11643-1999《公民身份號碼》中做了明確規(guī)定。
??????? *GB11643-1999《公民身份號碼》為GB11643-1989《社會保障號碼》的修訂版,其中指出將原標(biāo)準(zhǔn)名稱“社會保障號碼”更名為“公民身份號碼”,另外GB11643-1999《公民身份號碼》從實施之日起代替GB11643-1989。
??????? *公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位校驗碼。其含義如下: *1. 地址碼:表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。
??????? *2. 出生日期碼:表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日分別用4位、2位、2位數(shù)字表示,之間不用分隔符。
??????? *3. 順序碼:表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
??????? *校驗的計算方式: *1. 對前17位數(shù)字本體碼加權(quán)求和
??????? *公式為:S = Sum(Ai * Wi), i = 0, ... , 16
??????? *其中Ai表示第i位置上的身份證號碼數(shù)字值,Wi表示第i位置上的加權(quán)因子,其各位對應(yīng)的值依次為:
??????? *7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
??????? *2. 以11對計算結(jié)果取模
??????? *Y = mod(S, 11) *3. 根據(jù)模的值得到對應(yīng)的校驗碼對應(yīng)關(guān)系為:
??????? *Y值: 0 1 2 3 4 5 6 7 8 9 10
??????? *校驗碼: 1 0 X 9 8 7 6 5 4 3 2
??????? */
??????? 代碼 ?1??///?<summary>
?2?????????///?身份證驗證
?3?????????///?</summary>
?4?????????///?<param?name="Id">身份證號</param>
?5?????????///?<returns></returns>
?6?????????public?bool?CheckIDCard(string?Id)
?7?????????{
?8?????????????if?(Id.Length?==?18)
?9?????????????{
10?????????????????bool?check?=?CheckIDCard18(Id);
11?????????????????return?check;
12?????????????}
13?????????????else?if?(Id.Length?==?15)
14?????????????{
15?????????????????bool?check?=?CheckIDCard15(Id);
16?????????????????return?check;
17?????????????}
18?????????????else
19?????????????{
20?????????????????return?false;
21?????????????}
22?????????}
23?????????///?<summary>
24?????????///?18位身份證驗證
25?????????///?</summary>
26?????????///?<param?name="Id">身份證號</param>
27?????????///?<returns></returns>
28?????????private?bool?CheckIDCard18(string?Id)
29?????????{
30?????????????long?n?=?0;
31?????????????if?(long.TryParse(Id.Remove(17),?out?n)?==?false?||?n?<?Math.Pow(10,?16)?||?long.TryParse(Id.Replace('x',?'0').Replace('X',?'0'),?out?n)?==?false)
32?????????????{
33?????????????????return?false;//數(shù)字驗證
34?????????????}
35?????????????string?address?=?"11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36?????????????if?(address.IndexOf(Id.Remove(2))?==?-1)
37?????????????{
38?????????????????return?false;//省份驗證
39?????????????}
40?????????????string?birth?=?Id.Substring(6,?8).Insert(6,?"-").Insert(4,?"-");
41?????????????DateTime?time?=?new?DateTime();
42?????????????if?(DateTime.TryParse(birth,?out?time)?==?false)
43?????????????{
44?????????????????return?false;//生日驗證
45?????????????}
46?????????????string[]?arrVarifyCode?=?("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47?????????????string[]?Wi?=?("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
48?????????????char[]?Ai?=?Id.Remove(17).ToCharArray();
49?????????????int?sum?=?0;
50?????????????for?(int?i?=?0;?i?<?17;?i++)
51?????????????{
52?????????????????sum?+=?int.Parse(Wi[i])?*?int.Parse(Ai[i].ToString());
53?????????????}
54?????????????int?y?=?-1;
55?????????????Math.DivRem(sum,?11,?out?y);
56?????????????if?(arrVarifyCode[y]?!=?Id.Substring(17,?1).ToLower())
57?????????????{
58?????????????????return?false;//校驗碼驗證
59?????????????}
60?????????????return?true;//符合GB11643-1999標(biāo)準(zhǔn)
61?????????}
62?????????///?<summary>
63?????????///?15位身份證驗證
64?????????///?</summary>
65?????????///?<param?name="Id">身份證號</param>
66?????????///?<returns></returns>
67?????????private?bool?CheckIDCard15(string?Id)
68?????????{
69?????????????long?n?=?0;
70?????????????if?(long.TryParse(Id,?out?n)?==?false?||?n?<?Math.Pow(10,?14))
71?????????????{
72?????????????????return?false;//數(shù)字驗證
73?????????????}
74?????????????string?address?=?"11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75?????????????if?(address.IndexOf(Id.Remove(2))?==?-1)
76?????????????{
77?????????????????return?false;//省份驗證
78?????????????}
79?????????????string?birth?=?Id.Substring(6,?6).Insert(4,?"-").Insert(2,?"-");
80?????????????DateTime?time?=?new?DateTime();
81?????????????if?(DateTime.TryParse(birth,?out?time)?==?false)
82?????????????{
83?????????????????return?false;//生日驗證
84?????????????}
85?????????????return?true;//符合15位身份證標(biāo)準(zhǔn)
86?????????}
轉(zhuǎn)載于:https://www.cnblogs.com/eduthanks/archive/2010/01/05/1639898.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的C#验证 中国 身份证 代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Can't connect to M
- 下一篇: Microsoft Speech