最近项目用到身份证校验,在提交公安系统做实名校验前,需要自己检查一下身份证格式是否正确;毕竟每查询一次需要money啊;

提前排除用户随手输入的号码。因此贴出了分享一下

#ifndef __YSP_IDCARD_H__
#define __YSP_IDCARD_H__
#include <string>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
using namespace std;
namespace NS_YSP
{
// wi =2(n-1)(mod 11)
static int32_t wi[18] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
// verify digit
static char vi[11] = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
class IDCard
{
public:
//身份证号码校验
static int32_t verify(string idcard, int32_t& gender/*0: 女 1::表示男*/)
{
//把15位身份证升级为18位
if ( idcard.length() == 15)
{
idcard = uptoeighteen(idcard);
}
if (idcard.length() != 18)
{
return -1;
}
//1-17必须是数字
for(int32_t i = 0; i < 17; ++i)
{
if( idcard[i] < '0' || idcard[i] > '9')
{
return -2;
}
}
//最后一位(第18位)为校验码,检查checksum值
char verify = toupper(idcard[17]);
if (verify != checksum(idcard))
{
return -3;
}
//第1-2位为省级行政区划代码,[11, 65] (第一位华北区1,东北区2,华东区3,中南区4,西南区5,西北区6)
string strProvince = idcard.substr(0, 2);
int32_t nProvince = atoi(strProvince.c_str());
if( nProvince < 11 || nProvince > 65 )
{
return -4;
}
//第3-4为为地级行政区划代码,第5-6位为县级行政区划代码因为经常有调整,这块就不做校验
//第7-10位为出生年份;//第11-12位为出生月份 //第13-14为出生日期
if( !checkdate(idcard.substr(6,8)) )
{
return -5;
}
//第15-17位为顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性
string strSeq = idcard.substr(14,3);
int32_t nSeq = atoi(strSeq.c_str());
gender = nSeq%2;
return 0;
}
static bool checkdate(const string& strDate)
{
string strYear = strDate.substr(0, 4);
int32_t nYear = atoi(strYear.c_str());
time_t timep;
time(&timep);
struct tm *p = gmtime(&timep);
if( p )
{
if( nYear < 1900 || nYear > 1900 + p->tm_year )
{
return false;
}
if( atoi(strDate.c_str()) > ( (1900 + p->tm_year)*10000 + p->tm_mon*100 + p->tm_mday ) )
{
return false;
}
}
string strMon = strDate.substr(4, 2);
int32_t nMon = atoi(strMon.c_str());
if( nMon <= 0 || nMon > 12 )
{
return false;
}
//月份天数表
int32_t days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool bLeapYear = (nYear % 4 == 0 && nYear % 100 != 0) || (nYear % 400 == 0);
if( bLeapYear )
{
days[1] = 29;
}
string strDay = strDate.substr(6, 2);
int32_t nDay = atoi(strDay.c_str());
if( nDay > days[nMon - 1 ] || nDay <= 0 )
{
return false;
}
return true;
}
//计算校验码
static char checksum(string eightcardid)
{
int32_t remaining = 0;
int32_t ai[18];
if ( eightcardid.length() == 18 )
{
eightcardid = eightcardid.substr(0, 17);
}
if ( eightcardid.length() == 17 )
{
int32_t sum = 0;
for (int32_t i = 0; i < 17; i++)
{
string k = eightcardid.substr(i, 1);
ai[i] = atoi(k.c_str());
}
for (int32_t i = 0; i < 17; i++)
{
sum = sum + wi[i] * ai[i];
}
remaining = sum % 11;
}
return vi[remaining];
}
//把15位身份证升级到18位身份证号码
static string uptoeighteen(const string& fifteencardid)
{
string eightcardid = fifteencardid.substr(0, 6);
//加上年月日
eightcardid = eightcardid + "19";
eightcardid = eightcardid + fifteencardid.substr(6) ;
//加上校验码
eightcardid.push_back(checksum(eightcardid));
return eightcardid;
}
};
}
#endif

大陆身份证号码格式校验代码相关推荐

  1. 校验身份证号码格式是否正确

    <?php /*** 校验身份证号码格式是否正确* @param string $idcard* @return bool*/ function checkIdcard($idcard) {$i ...

  2. JS(JavaScript)验证身份证号码格式的合法性

    一.JS(JavaScript)验证身份证号码格式的合法性,前端工程师会用到JavaScript验证身份证号码是否合法,这里分享一段本人多年以前多写的JavaScript验证输入身份证号码合法性的代码 ...

  3. 10年前写的,身份证号码验证VBA代码

    工作中经常与身份证号码打交道,现在各类信息系统都把身份证号码作为识别定义人员的关键字段,下面这段代码,在我的工作中发挥了极其重要的作用!分享出来,希望能帮助到更多的人! 10年前写的,if套if,格式 ...

  4. SpringBoot自定义注解实现身份证号格式校验

    背景 ​ 身份证的组成部分较为复杂, 如果仅使用正则表达式的话, 有些情况也无法校验出来, 例如正确的证件号为513334200310119074, 如果把最后一位变成9, 则是一个错误的证件号, 但 ...

  5. iOS之身份证号码全校验与校验位自动补全

    在项目中进行身份证号码的校验,首先有必要了解一下居民身份证的基本构成: 长度必须是18位,前17位必须是数字,第十八位可以是数字或X: 前两位必须是以下情形中的一种:11.12.13.14.15.21 ...

  6. Python编程100例--身份证号码的校验码

    身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...

  7. 如何对身份证号码进行校验?

    每个人的身份证号码都都是一串有特别意义的数字,如代表出生地,出生日,性别等,那么对于行政上的一些工作,核对身份证是不是输入有误,身份证是否造假,也是可以通过身份证上的号码数字进行核对检查. 先看一下原 ...

  8. C语言——实验一:查验身份证(身份证号码的校验码)

    前言 为什么我这个萌新要来写这篇文章?事情还要从上周三说起. 在上周三的程序设计基础课上,我们老师给我们全班同学布置了一项题为<实验一:查验身份证>的实验作业,这也是我第一次接触到实验作业 ...

  9. 身份证号码js校验(15位18位)

    idcard: {// 验证身份证(15位18位)validator: function (value) {// 1.传入15位或者18位身份证号码,18位号码末位可以为数字或Xvar idCard ...

  10. ipv4、ipv6格式校验代码

    ipv4.ipv6格式校验代码 一.题目 IPv4 地址格式: IPv4地址由4组十进制数组成,每组范围为 0 - 255,用"."分割. 注意:IPv4 地址内的数不能以 0 开 ...

最新文章

  1. USACO Barn Repair
  2. 前缀、中缀、后缀表达式及其相互转化的Java实现
  3. ajax nginx 转发 sessionid_Nginx+Apache实现动静分离 - 孙天飞
  4. 总结Linux-ubuntu基本配置方法(远程连接,数据库,jdk,tomcat......)
  5. c 求最小公倍数_公务员备考-最小公倍数和最小公约数问题
  6. hadoop3.2.1和java1.7版本不兼容解决方案(virtualBox下ubuntu环境linux系统)
  7. cpu 抖动_微抖动,繁忙的等待和绑定CPU
  8. linux串口程序不能,在uclinux下编写串口通信程序,COM2只能发送数据不能接收,是怎么回事呢?...
  9. jssdk 保存文件到手机_手机混用闪存到底是真是假?教你查手机闪存型号
  10. Oracle11g安装包下载
  11. 有了这款geek卸载工具,让你卸载不在烦恼!
  12. Linux编程学习笔记-多进程编程
  13. 骑行318、 2016.7.15
  14. Ubuntu 下查看DNS地址
  15. google搜索特殊字符
  16. 锂离子电池是由什么组成的
  17. T61迅盘无法正常工作
  18. 大家好!好想这里啊!
  19. TfLite: 把pb、h5文件转换为TfLite格式and quantilize
  20. RST切换成AHCI无法正常进入windows(装双系统Ubuntu)

热门文章

  1. 为保证云应用及虚拟串口功能正常使用,请务必下载安装Windows系统环境补丁
  2. VIVADO 下载mcs 文件
  3. UML建模工具2021年8-11月更新(共15款)
  4. 概率图模型(PGM):贝叶斯网(Bayesian network)初探
  5. 康奈尔大学做笔记方式
  6. ERStudio使用细则
  7. 独立站运营成败,7个细节不可忽视
  8. 功能测试项目——酒店管理系统
  9. 骨龄测试软件app_测测app下载-工具包-测测下载v1.0.11 安卓版-西西软件下载
  10. c++ win10下 遍历文件夹的方式, dirent.h头文件缺失问题