Из -за потребностей проекта я написал метод C# для проверки идентификационных карт на основе онлайн -информации.
/*
*Теоретическая часть:
* 15-значный идентификационный номер = 6-значный код области + 6-значный день рождения + 3-значный серийный номер
* 18-значный идентификационный номер = 6-значный код области + 8-значный день рождения + 3-значный серийный номер + 1-значный код проверки
*
*Первые две цифры кода страны для каждой провинции, города и региона:
* Пекин 11 Jilin 22 Fujian 35 Guangdong 44 Yunnan 53 Tianjin 12 Heilongjiang 23 Jiangxi 36 Guangxi 45 Тибет 54 Hebei 13 Shanghai 31 Shandong 37 Hainan 46 Shaanxi 61 Shanxi 14 Jiangsu 32 Henan 41 Chongquing 50.
Гансу 62 Внутренняя Монголия 15 Чжэцзян 33 Хубей 42 Sichuan 51 Цинхай 63 Liaoning 21 Anhui 34 Hunan 43 Guizhou 52 Ningxia 64 Xinjiang 65 Тайвань 71 Гонг Конг 81 Макао 82 ОВЕРСИТЕЛЬ 91
*18-значный стандарт удостоверения личности явно предусматривается в GB11643-1999 «Число гражданских личности», осуществляемое Государственной администрацией качества и технического надзора 1 июля 1999 года.
*GB11643-1999 «Номер личности граждан»-это пересмотренная версия GB11643-1989 «Номер социального страхования», в которой говорится, что первоначальное стандартное название «Номер социального страхования» будет переименовано в «Номер личности граждан», а также GB11643-1999 «Номер личности граждан». Он заменит GB11643-1989 с даты реализации.
*Номер идентификации граждан является характерным комбинированным кодом, состоящим из семнадцатизначного кода тела и однозначного контрольного кода. Заказ слева направо: шестизначный код адреса, восьмизначная дата кода рождения, трехзначный код последовательности и однозначный контрольный код. Его значение следующее:
*1.
*2. 2 цифры и 2 цифры соответственно, без разделителей между ними.
*3. назначен женщинам.
*Метод проверки расчета:
*1.
* Формула: s = sum (ai * wi), i = 0, ..., 16
*Где ИИ представляет цифровое значение номера идентификационных карт в позиции I-TH, WI представляет собой весовой коэффициент в позиции I-TH, а соответствующие значения:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2.
*Y = mod (s, 11)
*3.
*Y Значение: 0 1 2 3 4 5 6 7 8 9 10 10 10
*Проверьте код: 1 0 x 9 8 7 6 5 4 3 2
*/
код
1 /// <Сводка>
2 /// проверка удостоверения личности
3 /// </сводка>
4 /// <param name = "id"> номер идентификационной карты </param>
5 /// <возвращается></возвращается>
6 public bool checkidcard (идентификатор строки)
7 {
8 if (id.length == 18)
9 {
10 bool check = checkidcard18 (id);
11 вернуть чек;
12}
13 else if (id.length == 15)
14 {
15 bool check = checkidcard15 (id);
16 вернуть чек;
17}
18.
19 {
20 вернуть ложь;
двадцать один }
двадцать два }
23 /// <Сводка>
24 /// 18-значная проверка удостоверения личности
25 /// </summary>
26 /// <param name = "id"> номер идентификационной карты </param>
27 /// <returns> </returns>
28 private bool checkidcard18 (идентификатор строки)
29 {
30 длинный n = 0;
31 if (long.trarse (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 вернуть false; // проверка номеров
34}
35 string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 if (address.indexof (id.remove (2)) == -1)
37 {
38 вернуть ложь; // Проверка провинции
39 }
40 String Birth = id.Substring (6, 8) .insert (6, "-"). INSERT (4, "-");
41 DateTime Time = new DateTime ();
42 if (datetime.trarse (рождение, время) == false)
43 {
44 вернуть ложь; // проверка дня рождения
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"). Сплит (',') ;
48 char [] ai = id.remove (17) .tchararray ();
49 int sum = 0;
50 для (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 вернуть false; // проверка кода проверки
59 }
60 Вернуть True;
61 }
62 /// <summary>
63 /// 15-значная проверка удостоверения личности
64 /// </summary>
65 /// <param name = "id"> номер идентификационной карты </param>
66 /// <return> </returns>
67 private bool checkidcard15 (идентификатор строки)
68 {
69 длинный n = 0;
70 if (long.trarse (id, out n) == false || n <math.pow (10, 14))
71 {
72 вернуть false; // проверка номера
73}
74 string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 if (address.indexof (id.remove (2)) == -1)
76 {
77 вернуть ложь; // Проверка провинции
78 }
79 String Birth = Id.Substring (6, 6) .insert (4, "-"). INSERT (2, "-");
80 DateTime Time = new DateTime ();
81 if (dateTime.trarse (рождение, время) == false)
82 {
83 вернуть ложь; // проверка дня рождения
84}
85 Вернуть True; // Соответствует стандарту 15-значной идентификационной карты.