Aufgrund der Projektanforderungen habe ich eine C#-Methode zur ID-Kartenüberprüfung basierend auf Online-Informationen geschrieben. Diese Methode wurde unter VS2005[C/S] geschrieben.
/*
*Theoretischer Teil:
* 15-stellige ID-Nummer = 6-stellige Vorwahl + 6-stelliger Geburtstag + 3-stellige Seriennummer
* 18-stellige ID-Nummer = 6-stellige Vorwahl + 8-stelliger Geburtstag + 3-stellige Seriennummer + 1-stelliger Bestätigungscode
*
*Die ersten beiden Ziffern des Ländercodes für jede Provinz, Stadt und Region sind:
* Peking 11 Jilin 22 Fujian 35 Guangdong 44 Yunnan 53 Tianjin 12 Heilongjiang 23 Jiangxi 36 Guangxi 45 Tibet 54 Hebei 13 Shanghai 31 Shandong 37 Hainan 46 Shaanxi 61 Shanxi 14 Jiangsu 32 Henan 41 Chongqing 50
Gansu 62 Innere Mongolei 15 Zhejiang 33 Hubei 42 Sichuan 51 Qinghai 63 Liaoning 21 Anhui 34 Hunan 43 Guizhou 52 Ningxia 64 Xinjiang 65 Taiwan 71 Hongkong 81 Macau 82 Übersee 91
*Der 18-stellige ID-Kartenstandard ist in GB11643-1999 „Citizen Identity Number“ klar festgelegt, das am 1. Juli 1999 von der State Administration of Quality and Technical Supervision eingeführt wurde.
*GB11643-1999 „Citizen Identity Number“ ist eine überarbeitete Version von GB11643-1989 „Social Security Number“, die besagt, dass der ursprüngliche Standardname „Social Security Number“ in „Citizen Identity Number“ umbenannt wird „Bürgeridentitätsnummer“ Sie ersetzt GB11643-1989 ab dem Datum der Implementierung.
*Die Bürgeridentitätsnummer ist ein charakteristischer Kombinationscode, der aus einem siebzehnstelligen Körpercode und einem einstelligen Prüfcode besteht. Die Reihenfolge von links nach rechts ist: sechsstelliger Adresscode, achtstelliger Geburtsdatumscode, dreistelliger Sequenzcode und einstelliger Prüfcode. Seine Bedeutung ist wie folgt:
*1. Adresscode: Gibt den Verwaltungsbezirkscode des Landkreises (Stadt, Banner, Bezirk) an, in dem sich der ständige Wohnsitz des Kodierungsobjekts befindet, und wird gemäß den Bestimmungen von GB/T2260 implementiert.
*2. Geburtsdatumscode: Gibt das Jahr, den Monat und den Tag der Geburt des Kodierungsobjekts an. Er wird gemäß den Bestimmungen von GB/T7408 implementiert. 2 Ziffern bzw. 2 Ziffern, ohne Trennzeichen dazwischen.
*3. Sequenzcode: Gibt die Sequenznummer an, die Personen zugewiesen wird, die im selben Jahr, demselben Monat und demselben Tag innerhalb des durch denselben Adresscode identifizierten Gebiets geboren wurden. Ungerade Nummern des Sequenzcodes werden Männern zugewiesen den Weibchen zugeordnet.
*Berechnungsmethode der Überprüfung:
*1. Gewichtete Summe der ersten 17 Ziffern des Ontologiecodes
*Die Formel lautet: S = Summe(Ai * Wi), i = 0, ... , 16
*wobei Ai den digitalen Wert der ID-Kartennummer an der i-ten Position darstellt, Wi den Gewichtungsfaktor an der i-ten Position darstellt und die entsprechenden Werte sind:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. Nehmen Sie das Berechnungsergebnis Modulo 11
*Y = mod(S, 11)
*3. Die entsprechende Beziehung zwischen den auf der Grundlage des Modulwerts erhaltenen Prüfcodes ist:
*Y-Wert: 0 1 2 3 4 5 6 7 8 9 10
*Code prüfen: 1 0 X 9 8 7 6 5 4 3 2
*/
Code
1 ///
2 /// Überprüfung des Personalausweises
3 ///
4 /// ID-Kartennummer
5 ///
6 public bool CheckIDCard(string Id)
7 {
8 if (Id.Length == 18)
9 {
10 bool check = CheckIDCard18(Id);
11 Rückgabescheck;
12}
13 sonst wenn (Id.Length == 15)
14 {
15 bool check = CheckIDCard15(Id);
16 Rückgabescheck;
17}
18 sonst
19 {
20 gibt false zurück;
einundzwanzig }
zweiundzwanzig }
23 ///
24 /// 18-stellige Ausweisüberprüfung
25 ///
26 /// Ausweisnummer
27 ///
28 privater bool CheckIDCard18(string Id)
29 {
30 lang 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;//Nummernüberprüfung
34}
35 string address = „11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91“;
36 if (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 return false;//Provinzüberprüfung
39 }
40 stringbirth = 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;//Geburtstagsüberprüfung
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 für (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;//Verifizierung des Bestätigungscodes
59 }
60 return true; //Entspricht dem Standard GB11643-1999
61 }
62 ///
63 /// 15-stellige Verifizierung des Personalausweises
64 ///
65 /// Ausweisnummer
66 ///
67 privater Bool CheckIDCard15(String-ID)
68 {
69 lang n = 0;
70 if (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 return false;//Nummernüberprüfung
73}
74 string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 if (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 return false;//Provinzüberprüfung
78 }
79 stringbirth = 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;//Geburtstagsüberprüfung
84}
85 return true;//Entspricht dem 15-stelligen ID-Kartenstandard