نظرًا لاحتياجات المشروع، كتبت طريقة C# للتحقق من بطاقة الهوية بناءً على المعلومات عبر الإنترنت. تمت كتابة هذه الطريقة تحت VS2005[C/S].
/*
*الجزء النظري:
* رقم الهوية المكون من 15 رقمًا = رمز المنطقة المكون من 6 أرقام + تاريخ الميلاد المكون من 6 أرقام + الرقم التسلسلي المكون من 3 أرقام
* رقم الهوية المكون من 18 رقمًا = رمز المنطقة المكون من 6 أرقام + تاريخ الميلاد المكون من 8 أرقام + الرقم التسلسلي المكون من 3 أرقام + رمز التحقق المكون من رقم واحد
*
*أول رقمين من رمز البلد لكل مقاطعة ومدينة ومنطقة هما:
* بكين 11 جيلين 22 فوجيان 35 قوانغدونغ 44 يوننان 53 تيانجين 12 هيلونغجيانغ 23 جيانغشي 36 قوانغشي 45 التبت 54 خبي 13 شنغهاي 31 شاندونغ 37 هاينان 46 شنشي 61 شانشي 14 جيانغسو 32 خنان 41 تشونغتشينغ 50
قانسو 62 منغوليا الداخلية 15 تشجيانغ 33 هوبي 42 سيتشوان 51 تشينغهاي 63 لياونينغ 21 آنهوي 34 هونان 43 قويتشو 52 نينغشيا 64 شينجيانغ 65 تايوان 71 هونغ كونغ 81 ماكاو 82 ما وراء البحار 91
*معيار بطاقة الهوية المكونة من 18 رقمًا منصوص عليه بوضوح في GB11643-1999 "رقم هوية المواطن" الذي نفذته إدارة الدولة للجودة والإشراف الفني في 1 يوليو 1999.
*GB11643-1999 "رقم هوية المواطن" هو نسخة منقحة من GB11643-1989 "رقم الضمان الاجتماعي"، والذي ينص على أنه سيتم إعادة تسمية الاسم القياسي الأصلي "رقم الضمان الاجتماعي" إلى "رقم هوية المواطن"، بالإضافة إلى GB11643-1999 "رقم هوية المواطن" سيحل محل GB11643-1989 اعتباراً من تاريخ التنفيذ.
*رقم هوية المواطن هو رمز مركب مميز، يتكون من رمز شخصي مكون من سبعة عشر رقمًا ورمز فحص مكون من رقم واحد. الترتيب من اليسار إلى اليمين هو: رمز العنوان المكون من ستة أرقام، ورمز تاريخ الميلاد المكون من ثمانية أرقام، ورمز التسلسل المكون من ثلاثة أرقام، ورمز التحقق المكون من رقم واحد. معناها هو كما يلي:
*1. رمز العنوان: يشير إلى رمز التقسيم الإداري للمقاطعة (المدينة، البانر، المنطقة) التي يقع فيها مكان الإقامة الدائم لكائن الترميز، ويتم تنفيذه وفقًا لأحكام GB/T2260.
*2. رمز تاريخ الميلاد: يشير إلى سنة وشهر ويوم ميلاد كائن الترميز، ويتم تنفيذه وفقًا لأحكام GB/T7408. رقمين، ورقمين على التوالي، بدون فواصل بينهما.
*3. رمز التسلسل: يشير إلى الرقم التسلسلي المخصص للأشخاص المولودين في نفس العام ونفس الشهر ونفس اليوم داخل المنطقة المحددة بنفس رمز العنوان، ويتم تخصيص الأرقام الفردية لرمز التسلسل للذكور المخصصة للإناث.
*طريقة حساب التحقق:
*1. المجموع المرجح لأول 17 رقمًا من رمز الوجود
*الصيغة هي: S = Sum(Ai * Wi)، i = 0، ... ، 16
*حيث تمثل Ai القيمة الرقمية لرقم بطاقة الهوية عند الموضع i، وتمثل Wi عامل الترجيح عند الموضع i، والقيم المقابلة هي:
*7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
*2. خذ وحدة نتيجة الحساب 11
*Y = mod(S, 11)
*3 العلاقة المقابلة بين رموز التحقق التي تم الحصول عليها بناءً على قيمة الوحدة هي:
*قيمة Y: 0 1 2 3 4 5 6 7 8 9 10
*رمز التحقق: 1 0X9 8 7 6 5 4 3 2
*/
شفرة
1 /// <الملخص>
2 /// التحقق من بطاقة الهوية
3 /// </الملخص>
4 /// <param name="Id">رقم بطاقة الهوية</param>
5 /// <returns></returns>
6 منطقي عام CheckIDCard (معرف السلسلة)
7 {
8 إذا (معرف الطول == 18)
9 {
10 فحص منطقي = CheckIDCard18(Id);
11 فحص الإرجاع؛
12}
13 آخر إذا (معرف الطول == 15)
14 {
15 فحص منطقي = CheckIDCard15(Id);
16 فحص الإرجاع؛
17}
18 آخر
19 {
20 إرجاع كاذب؛
واحد وعشرون }
إثنان وعشرون }
23 /// <الملخص>
24 /// التحقق من بطاقة الهوية المكونة من 18 رقما
25 /// </summary>
26 /// <param name="Id">رقم بطاقة الهوية</param>
27 /// <returns></returns>
28 منطق خاص CheckIDCard18 (معرف السلسلة)
29 {
30 طويل ن = 0;
31 إذا (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0') .استبدال ('X'، '0')، خارج n) == خطأ)
32 {
33 إرجاع خطأ؛//التحقق من الرقم
34}
35 عنوان سلسلة = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
36 إذا (address.IndexOf(Id.Remove(2)) == -1)
37 {
38 إرجاع خطأ;//التحقق من المقاطعة
39 }
40 سلسلة ولادة = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
41 DateTime time = new DateTime();
42 إذا (DateTime.TryParse(الميلاد، وقت الخروج) == خطأ)
43 {
44 إرجاع خطأ;//التحقق من تاريخ الميلاد
45 }
46 string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
47 سلسلة[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").تقسيم(',') ;
48 char[] Ai = Id.Remove(17).ToCharArray();
49 مجموع كثافة العمليات = 0;
50 لـ (int i = 0; i < 17; i++)
51 {
52 مجموع += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());
53}
54 إنت ص = -1;
55 Math.DivRem(sum, 11, out y);
56 إذا (arrVarifyCode[y] != Id.Substring(17, 1).ToLower())
57 {
58 return false;//رمز التحقق Verification
59 }
60 return true; // يتوافق مع معيار GB11643-1999
61 }
62 /// <الملخص>
63 /// التحقق من بطاقة الهوية المكونة من 15 رقمًا
64 /// </summary>
65 /// <param name="Id">رقم بطاقة الهوية</param>
66 /// <returns></returns>
67 منطقي خاص CheckIDCard15 (معرف السلسلة)
68 {
69 طويل ن = 0;
70 إذا (long.TryParse(Id, out n) == false || n < Math.Pow(10, 14))
71 {
72 إرجاع خطأ;//التحقق من الرقم
73}
74 عنوان سلسلة = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
75 إذا (address.IndexOf(Id.Remove(2)) == -1)
76 {
77 return false;//التحقق من المقاطعة
78 }
79 ولادة سلسلة = Id.Substring(6, 6).Insert(4, "-").Insert(2, "-");
80 DateTime time = new DateTime();
81 إذا (DateTime.TryParse(birth, out time) == false)
82 {
83 إرجاع خطأ;//التحقق من تاريخ الميلاد
84}
85 return true;//يتوافق مع معيار بطاقة الهوية المكونة من 15 رقمًا