现在的位置: 首页 > 综合 > 正文

检测身份证是否符合规则

2019年04月19日 ⁄ 综合 ⁄ 共 1671字 ⁄ 字号 评论关闭

转载请注明出处: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;
}



抱歉!评论已关闭.