检测身份证是否符合规则

来源:互联网 发布:linux和openwrt 编辑:程序博客网 时间:2024/04/30 23:39

转载请注明出处:http://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/40888901

//检测身份证号是否符合格式(0-符合,非0-不符合)//位:0-正确,1-错误//位意义(左->右):01234567//  行区划代码州级(不检)县级(不检)年月日顺序码(不检)  校验码WORD CheckIdentityCard(TCHAR*cardID){WORD code = 0;//位数不对。if (_tcslen(cardID) != 18)return ~0;//省、市、自治区行政区划代码TCHAR prov[][3] = { _T("11"), _T("12"), _T("13"), _T("14"), _T("15"),_T("21"), _T("22"), _T("23"),_T("31"), _T("32"), _T("33"), _T("34"), _T("35"), _T("36"), _T("37"),_T("41"), _T("42"), _T("43"), _T("44"), _T("45"), _T("46"),_T("50"), _T("51"), _T("52"), _T("53"),_T("61"), _T("62"), _T("63"), _T("64"), _T("65"), _T("71"), _T("81"), _T("82")};bool isRight = false;for (int i = 0; i < sizeof(prov) / sizeof(TCHAR*); i++)if (prov[i][0] == cardID[0])if (prov[i][1] == cardID[1]){isRight = true;break;}if (!isRight)code++;//自治州(不检测)code <<= 1;//县级(不检测)code <<= 1;//年code <<= 1;int year = 0;year +=1000* (cardID[6]-48);year += 100 * (cardID[7] - 48);year += 10 * (cardID[8] - 48);year += 1 * (cardID[9] - 48);if (!((year >= 1800) && (year <= 2100)))code++;//月code <<= 1;int mon = 0;mon += 10 * (cardID[10] - 48);mon += 1 * (cardID[11] - 48);if (!((mon >= 1) && (mon <= 12)))code++;//日code <<= 1;int day = 0;day += 10 * (cardID[12] - 48);day += 1 * (cardID[13] - 48);switch (mon){//当月份正确,用这3行case检测case 1:case 3:case 5:case 7:case 8:case 10:case 12:if (!((day >= 1) && (day <= 31)))code++;break;case 4:case 6:case 9:case 11:if (!((day >= 1) && (day <= 30)))code++;break;case 2:if (!((day >= 1) && (day <= 29)))code++;// 因为不进行润年处理,2月以29天来算break;default://当月份不正确,以一个月31天来检测if (!((day >= 1) && (day <= 31)))code++;break;}//顺序码(不检测)code <<= 1;//校验码code <<= 1;int weight[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//由2^(17-i)计算而来。i从0开始TCHAR checkCode[] = _T("10X98765432");//校验码int sum = 0;for (int i = 0; i < 17; i++)sum += (cardID[i] - 48) *weight[i];sum %= 11;if(cardID[17]!=checkCode[sum])code++;return code;}



0 0