En raison des besoins du projet, j'ai écrit une méthode C# pour la vérification des cartes d'identité basée sur des informations en ligne. Cette méthode a été écrite sous VS2005[C/S].
/*
*Partie théorique :
* Numéro d'identification à 15 chiffres = indicatif régional à 6 chiffres + anniversaire à 6 chiffres + numéro de série à 3 chiffres
* Numéro d'identification à 18 chiffres = indicatif régional à 6 chiffres + anniversaire à 8 chiffres + numéro de série à 3 chiffres + code de vérification à 1 chiffre
*
*Les deux premiers chiffres du code du pays pour chaque province, ville et région sont :
* Pékin 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 Mongolie intérieure 15 Zhejiang 33 Hubei 42 Sichuan 51 Qinghai 63 Liaoning 21 Anhui 34 Hunan 43 Guizhou 52 Ningxia 64 Xinjiang 65 Taïwan 71 Hong Kong 81 Macao 82 Outre-mer 91
*La norme de carte d'identité à 18 chiffres est clairement stipulée dans le GB11643-1999 « Numéro d'identité citoyen » mis en œuvre par l'Administration d'État de la qualité et de la supervision technique le 1er juillet 1999.
*GB11643-1999 « Numéro d'identité de citoyen » est une version révisée du « Numéro de sécurité sociale » GB11643-1989, qui indique que le nom standard d'origine « Numéro de sécurité sociale » sera renommé « Numéro d'identité de citoyen ». "Numéro d'identité du citoyen" Il remplacera le GB11643-1989 à compter de la date de mise en œuvre.
*Le numéro d'identité du citoyen est un code combiné caractéristique, composé d'un code corporel à dix-sept chiffres et d'un code de contrôle à un chiffre. L'ordre de gauche à droite est le suivant : code d'adresse à six chiffres, code de date de naissance à huit chiffres, code de séquence à trois chiffres et code de contrôle à un chiffre. Sa signification est la suivante :
*1. Code d'adresse : indique le code de division administrative du comté (ville, bannière, district) où se trouve la résidence permanente de l'objet de codage, et est mis en œuvre conformément aux dispositions du GB/T2260.
*2. Code de date de naissance : indique l'année, le mois et le jour de naissance de l'objet de codage. Il est mis en œuvre conformément aux dispositions du GB/T7408. L'année, le mois et le jour sont représentés par 4 chiffres. 2 chiffres et 2 chiffres respectivement, sans séparateurs entre eux.
*3. Code de séquence : indique le numéro de séquence attribué aux personnes nées la même année, le même mois et le même jour dans la zone identifiée par le même code d'adresse. Les nombres impairs du code de séquence sont attribués aux hommes, et les nombres pairs sont attribués. attribué aux femelles.
*Méthode de calcul de vérification :
*1. Somme pondérée des 17 premiers chiffres du code d'ontologie
*La formule est : S = Somme(Ai * Wi), i = 0, ... , 16
*où Ai représente la valeur numérique du numéro de carte d'identité à la ième position, Wi représente le facteur de pondération à la ième position, et les valeurs correspondantes sont :
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. Prenez le résultat du calcul modulo 11.
*Y = mod(S, 11)
*3. La relation correspondante entre les codes de contrôle obtenus en fonction de la valeur du module est :
*Valeur Y : 0 1 2 3 4 5 6 7 8 9 10
*Vérifiez le code : 1 0 X 9 8 7 6 5 4 3 2
*/
code
1 ///
2 /// Vérification de la carte d'identité
3 ///
4 /// Numéro de carte d'identité
5 ///
6 public bool CheckIDCard (ID de chaîne)
7 {
8 si (Id.Length == 18)
9 {
10 booléen check = CheckIDCard18(Id);
11 chèque de retour ;
12}
13 sinon si (Id.Length == 15)
14 {
15 booléen check = CheckIDCard15(Id);
16 chèque de retour ;
17}
18 autres
19 {
20 renvoie faux ;
vingt-et-un }
vingt-deux }
23 ///
24 /// Vérification de la carte d'identité à 18 chiffres
25 ///
26 /// Numéro de carte d'identité
27 ///
28 bool privé CheckIDCard18 (ID de chaîne)
29 {
30 longs 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;//Vérification du numéro
34}
Adresse de 35 chaînes = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91" ;
36 si (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 return false;//Vérification de la province
39 }
40 chaîne naissance = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 DateTime heure = new DateTime();
42 si (DateTime.TryParse (naissance, heure de sortie) == false)
43 {
44 return false ;//Vérification de l'anniversaire
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 chaîne[] 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 somme entière = 0 ;
50 pour (int i = 0; i < 17; i++)
51 {
52 somme += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 entier y = -1 ;
55 Math.DivRem(somme, 11, sur y);
56 si (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 return false ;//Vérification du code de vérification
59 }
60 return true ; //Conforme à la norme GB11643-1999.
61 }
62 ///
63 /// Vérification de la carte d'identité à 15 chiffres
64 ///
65 /// Numéro de carte d'identité
66 ///
67 bool privé CheckIDCard15 (ID de chaîne)
68 {
69 longueur n = 0 ;
70 si (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 return false;//Vérification du numéro
73}
Adresse de 74 chaînes = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91" ;
75 si (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 renvoie faux ;//Vérification de la province
78 }
79 naissance de chaîne = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 DateTime heure = new DateTime();
81 si (DateTime.TryParse (naissance, heure de sortie) == false)
82 {
83 return false ;//Vérification de l'anniversaire
84}
85 renvoie vrai ;//Conforme à la norme de carte d'identité à 15 chiffres