C++身份证号验证
由于项目需要,在网上的例子大多数都是C#的,所以添加了这个身份证号的验证的C++程序
实现身份证生成和校验
BOOL CID_Card_No_GenerateDlg::IDNumberVerify(CString strIDNumber)
{
CString strIDNumberInfo, strTemp = _T("");
CString strAddrInfo = _T(""), strYear, strMonth, strDay, strMale, strCheckSum;
INT nAddrID, nMonth, nDay, nSum = 0, nMod;
BYTE ucIDInfo[17] ={ NULL };
BYTE ucCoefficient[17] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,10, 5, 8, 4, 2};
TCHAR cszMod[11] ={'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
for(INT i = 0; i< 17; i++)
{
ucIDInfo[i] = _wtoi(strIDNumber.Mid(i, 1));
}
// 判断号码长度是否符合要求
if(strIDNumber.GetLength() != 18)
{
SetDlgItemText(IDC_EDIT_ID_INFO, _T("请输入18位有效身份证号"));
return FALSE;
}
//判断地址码是否存在
nAddrID = _wtoi(strIDNumber.Left(6));
mapCountyAll.Lookup(nAddrID, strAddrInfo);
if(strAddrInfo == _T(""))
{
SetDlgItemText(IDC_EDIT_ID_INFO, _T("无法查询到地址信息,请输入有效身份证号"));
return FALSE;
}
//判断出生日期是否正常
nMonth = _wtoi(strIDNumber.Mid(10, 2));
nDay = _wtoi(strIDNumber.Mid(12, 2));
if((nMonth > 12) || (nDay>31))
{
SetDlgItemText(IDC_EDIT_ID_INFO, _T("无效的出生日期, 请输入有效身份证号"));
return FALSE;
}
//判断校验码是否符合要求
for(BYTE i = 0; i < 17; i++)
{
nSum += ucCoefficient[i] * ucIDInfo[i];
strTemp.Format(_T("%d"), ucIDInfo[i]);
}
nMod = nSum % 11;
strCheckSum = cszMod[nMod];
if(strCheckSum != strIDNumber.Right(1))
{
SetDlgItemText(IDC_EDIT_ID_INFO, _T("校验码错误,请输入有效身份证号"));
return FALSE;
}
return TRUE;
}
项目工程可以到资源里下载