C++身份證號驗證

kjj2008kjj發表於2020-11-14

C++身份證號驗證
由於專案需要,在網上的例子大多數都是C#的,所以新增了這個身份證號的驗證的C++程式
mfc在這裡插入圖片描述
實現身份證生成和校驗

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;
}

專案工程可以到資源裡下載

相關文章