昨天项目要求将身份证做一次验证,于是总结了一下C/C++下身份证号码的实现
身份证号码的构成
资料显示,现在我国公民使用的18为身份证号码,是由前 17位信息码和最后一位校验码组成。而,前17为信息码,又有各自的含义:六位地址码,八位出生日期码,三位顺序码。地址码(身份证前六位)
一。六位地址码
前六位的地址码,是按照GB/T2260的规定,给常住户口所在县(市、旗、区)的行政区域分配的代码。
二。出生日期码(身份证中8位)
8为的出生日期,分别是 XXXX年XX月XX日
三。顺序码
表示在同一地区,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
身份证号的验证方法
校验码,是由前十七位数字码加权求和取模得到的数字,对应的校验码数组元素。
前17位数字码的权重分别是:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
其中,校验码数组为:1 0 X 9 8 7 6 5 4 3 2
至此,我们只需要将求出的校验码和身份证的第18位比较,即可知道该身份证号的正确与否。
MFC实现
bool CMy0121124829Dlg::SFZHValidate(CString sfz)
{
int weight[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char validate[]={ '1','0','X','9','8','7','6','5','4','3','2'};
int sum=0;
int mode=0;
if (sfz.GetLength()==18)
{
for(int i=0;i<sfz.GetLength()-1;i++){
sum=sum+(sfz[i]-'0')*weight[i];
}
mode=sum%11;
if (validate[mode]==sfz[17])
{
return true;
}
}
return false;
}