转载请注明出处:http://blog.csdn.net/hhhhhhhhhhkkkkkkkkkk/article/details/40888901
//检测身份证号是否符合格式(0-符合,非0-不符合) //位:0-正确,1-错误 //位意义(左->右): 0 1 2 3 4 5 6 7 // 行区划代码 州级(不检) 县级(不检) 年 月 日 顺序码(不检) 校验码 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; }