Debido a las necesidades del proyecto, escribí un método C# para la verificación de tarjetas de identificación basado en información en línea. Este método fue escrito en VS2005[C/S].
/*
*Parte teórica:
* Número de identificación de 15 dígitos = código de área de 6 dígitos + fecha de nacimiento de 6 dígitos + número de serie de 3 dígitos
* Número de identificación de 18 dígitos = código de área de 6 dígitos + fecha de nacimiento de 8 dígitos + número de serie de 3 dígitos + código de verificación de 1 dígito
*
*Los primeros dos dígitos del código de país para cada provincia, ciudad y región son:
* Beijing 11 Jilin 22 Fujian 35 Guangdong 44 Yunnan 53 Tianjin 12 Heilongjiang 23 Jiangxi 36 Guangxi 45 Tíbet 54 Hebei 13 Shanghai 31 Shandong 37 Hainan 46 Shaanxi 61 Shanxi 14 Jiangsu 32 Henan 41 Chongqing 50
Gansu 62 Mongolia Interior 15 Zhejiang 33 Hubei 42 Sichuan 51 Qinghai 63 Liaoning 21 Anhui 34 Hunan 43 Guizhou 52 Ningxia 64 Xinjiang 65 Taiwán 71 Hong Kong 81 Macao 82 Ultramar 91
*El estándar de tarjeta de identificación de 18 dígitos está claramente estipulado en GB11643-1999 "Número de identidad de ciudadano" implementado por la Administración Estatal de Calidad y Supervisión Técnica el 1 de julio de 1999.
*GB11643-1999 "Número de identidad de ciudadano" es una versión revisada de GB11643-1989 "Número de seguridad social", que establece que el nombre estándar original "Número de seguridad social" pasará a llamarse "Número de identidad de ciudadano". Además, GB11643-1999. “Número de Identidad Ciudadana” Reemplazará al GB11643-1989 a partir de la fecha de implementación.
*El número de identidad de ciudadano es un código combinado característico, compuesto por un código corporal de diecisiete dígitos y un código de control de un dígito. El orden de izquierda a derecha es: código de dirección de seis dígitos, código de fecha de nacimiento de ocho dígitos, código de secuencia de tres dígitos y código de verificación de un dígito. Su significado es el siguiente:
*1. Código de dirección: indica el código de división administrativa del condado (ciudad, bandera, distrito) donde se encuentra la residencia permanente del objeto de codificación y se implementa de acuerdo con las disposiciones de GB/T2260.
*2. Código de fecha de nacimiento: indica el año, mes y día de nacimiento del objeto de codificación. Se implementa de acuerdo con las disposiciones de GB/T7408. 2 dígitos, y 2 dígitos respectivamente, sin separadores entre ellos.
*3. Código de secuencia: indica el número de secuencia asignado a las personas nacidas en el mismo año, mismo mes y mismo día dentro del área identificada por el mismo código de dirección. Los números impares del código de secuencia se asignan a los varones y los números pares. asignado a las hembras.
*Método de cálculo de verificación:
*1 Suma ponderada de los primeros 17 dígitos del código de ontología.
*La fórmula es: S = Suma(Ai * Wi), i = 0, ... , 16
*donde Ai representa el valor digital del número de tarjeta de identificación en la posición i-ésima, Wi representa el factor de ponderación en la posición i-ésima y los valores correspondientes son:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. Tome el resultado del cálculo módulo 11.
*Y = modificación(S, 11)
*3. La relación correspondiente entre los códigos de verificación obtenidos en función del valor del módulo es:
*Valor Y: 0 1 2 3 4 5 6 7 8 9 10
*Código de consulta: 1 0 X 9 8 7 6 5 4 3 2
*/
código
1 /// <resumen>
2 /// verificación de tarjeta de identificación
3 /// </summary>
4 /// <param name="Id">Número de tarjeta de identificación</param>
5 /// <devoluciones></devoluciones>
6 bool público CheckIDCard (ID de cadena)
7 {
8 si (Id.Longitud == 18)
9 {
10 bool comprobar = CheckIDCard18(Id);
11 cheques devueltos;
12}
13 más si (Id.Longitud == 15)
14 {
15 bool comprobar = CheckIDCard15(Id);
16 cheques devueltos;
17}
18 más
19 {
20 devuelven falso;
veintiuno }
Veintidós }
23 /// <resumen>
24 /// Verificación de tarjeta de identificación de 18 dígitos
25 /// </summary>
26 /// <param name="Id">Número de tarjeta de identificación</param>
27 /// <devoluciones></devoluciones>
28 bool privado CheckIDCard18 (ID de cadena)
29 {
30 largos 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'), fuera n) == falso)
32 {
33 return false;//Verificación de número
34}
Dirección de 35 cadenas = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 si (dirección.IndexOf(Id.Remove(2)) == -1)
37 {
38 return false;//Verificación de provincia
39 }
40 cadena de nacimiento = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 FechaHora hora = nueva FechaHora();
42 if (DateTime.TryParse (nacimiento, hora de salida) == falso)
43 {
44 return false;//Verificación de cumpleaños
45 }
46 cadena[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 cadena[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Dividir(',') ;
48 caracteres[] Ai = Id.Remove(17).ToCharArray();
49 int suma = 0;
50 para (int i = 0; i < 17; i++)
51 {
52 suma += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 int y = -1;
55 Math.DivRem(suma, 11, fuera y);
56 si (arrVarifyCode[y]! = Id.Substring(17, 1).ToLower())
57 {
58 return false;//Verificación del código de verificación
59 }
60 return true; //Cumple con el estándar GB11643-1999
61 }
62 /// <resumen>
63 /// Verificación de tarjeta de identificación de 15 dígitos
64 /// </summary>
65 /// <param name="Id">Número de tarjeta de identificación</param>
66 /// <devoluciones></devoluciones>
67 bool privado CheckIDCard15 (ID de cadena)
68 {
69 largos n = 0;
70 si (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 return false;//Verificación de número
73}
Dirección de 74 cadenas = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 si (dirección.IndexOf(Id.Remove(2)) == -1)
76 {
77 return false;//Verificación de provincia
78 }
79 cadena de nacimiento = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 FechaHora hora = nueva FechaHora();
81 if (DateTime.TryParse (nacimiento, hora de salida) == falso)
82 {
83 return false;//Verificación de cumpleaños
84}
85 return true;//Cumple con el estándar de tarjeta de identificación de 15 dígitos