C# 实现18位身份证校验算法详解

需积分: 9 8 下载量 141 浏览量 更新于2024-09-11 1 收藏 35KB DOC 举报
本文介绍了一个C#实现的18位身份证格式验证算法,根据GB11643-1999《公民身份号码》标准,详细解释了身份证号码的结构和验证规则,并提供了相应的C#代码实现。 身份证号码结构详解: 1. 地址码:代表编码对象常住户口所在县(市、旗、区)的行政区划代码,遵循GB/T2260标准,由6位数字组成。 2. 出生日期码:表示编码对象的出生年、月、日,遵循GB/T7408标准,用8位数字表示,不包含分隔符。 3. 顺序码:在同一地址码标识的区域内,对同年同月同日出生的人进行编号,奇数分配给男性,偶数分配给女性,共3位数字。 4. 校验码:用于验证身份证号码的正确性,通过特定的加权求和公式和模运算计算得出,可为10个数字或字母X中的一种。 身份证号码验证算法: 1. 加权求和:将身份证号码前17位数字分别乘以对应的加权因子(Wi),然后求和。 2. 模运算:对求和结果取模11,得到余数Y。 3. 对应校验码:根据余数Y,从预设的校验码序列中找到对应值,即为18位身份证号码的最后一位。 C#代码实现身份证验证: ```csharp private string CheckCidInfo(string cid) { // 加权因子数组 int[] weights = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 校验码对应表 char[] checkDigits = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; int sum = 0; for (int i = 0; i < 17; i++) { int digit = cid[i] - '0'; if (digit >= 0 && digit <= 9) sum += weights[i] * digit; } int modulus = sum % 11; char checkChar = checkDigits[modulus]; // 如果最后一个字符与计算出的校验码匹配,则身份证有效 if (cid[17] == checkChar || (cid[17] == 'X' && checkChar == 'X')) return "身份证号码有效"; else return "身份证号码无效"; } ``` 这段代码首先定义了加权因子和校验码对应表,然后遍历身份证号码前17位,逐位乘以对应权重并累加,接着计算模11的余数,最后比较计算出的校验码与身份证号码的最后一位是否一致,从而判断身份证号码的合法性。 综上,该算法和代码能够有效地检查输入的18位身份证号码是否符合国家标准,适用于各种需要验证身份证号码有效性的C#程序中。