C#身份证号码校验
?
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
?
代碼 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
總結
- 上一篇: python文件复制_python文件的
- 下一篇: c# char unsigned_dll