15位身份证号码 ios_ios 身份证号码 - CSDN
  • 早期身份证15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题,因为15位身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,所以又增加了18位身份证号码编号规则。 15位...
    身份证号码编码方法
    要进行身份证号码的验证,首先要了解身份证号码的编码规则。我国身份证号码多由若干位数字或者数字与字母混合组成。早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,后来考虑到千年虫问题,因为15位的身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,所以又增加了18位身份证号码编号规则。

    15位身份证号码编码较为简单,从左到右其15位码依次为:

    1     2     3     4     5     6     7     8     9     10   11   12   13   14   15

    A     A     A     A     A     A     Y     Y     M    M    D     D     N    N    S

    前六位AAAAAA是身份证编码对象的所在地(出生地)的编码,该号码可由国家统计局公布的相关标准中得到。YY表示出生年的后两位,MM和DD表示出生月和日,不足两位的高位补0,NNS为顺序号,无法确定。S为性别识别码,男性为奇数,女性为偶数。例如,一位于1965年2月16日出生在湖北省巴东县的女性的15位身份证号码为:

    1     2     3     4     5     6     7     8     9     10   11   12   13   14   15

    A     A     A     A     A     A     Y     Y     M    M    D     D     N    N    S

    4     2     2     8     2     3     6     5     0     2     1     6     0     2     2

    18位身份证号码比15位身份证号码多出的3位中的两位用来补充2位的年份为4位,另外1位作为校验码存在。一项由国家质量技术监督局发布的标准对身份证号码的编码规则做了具体的规定。该标准为名《公民身份号码》,编号GB11643-1999,为国家强制标准。它代替了1989年公布的名为《社会保障号码》GB11643-1989国家强制标准,从1999年7月1日开始强制实施。该标准的内容介绍如下。

    1.标准适用范围:规定了公民身份号码的编码对象、号码的具体结构组成和表现形式,并规定每个编码对象将获得一个唯一的、终身不变的号码。

    2.编码对象:具有中国人民共和国国籍的公民。

    3.号码的结构组成和表现形式。

    该标准中对号码的构造组成和表现形式进行了如下的阐述:

    号码由17位本体码和1位校验码组成,这18位号码从左到右依次为:

    1     2     3     4     5     6     7     8     9     10   11   12   13   14   15   16   17   18

    A     A     A     A     A     A     Y     Y     Y     Y     M    M    D     D     N    N    S     C

    前六位AAAAAA同样是地区编码,按照国家推荐标准GB/T2260的规定进行编码。YYYY是扩充后的四位出生年码,MM和DD为出生月和日码,不足两位的仍然在高位补0。NNS为无法确定的顺序码,其中S为性别识别码,同样将奇数分配给男性,偶数分配给女性。第18位校验位是对前17位进行如下的计算得到的。

    使用数组B[I]表示从左到右第I个数字,W[I]表示第I位上的加权因子,需要注意的是,为了方便讲述,这里的数组第一个是B[1]而不是计算机中的B[0],W[I]也是同样。加权因子依次为:

    1     2     3     4     5     6     7     8     9     10   11   12   13   14   15   16   17

    7     9     10   5     8     4     2     1     6     3     7     9     10   5     8     4     2

    得到第18位的值C首先要利用这个加权因子计算出 的值, 的计算公式为:


    即,将前17位的数字与其对应的加权因子相乘,再将积相加,最后的和再除以11,取其余。除以11最后的余有11种可能,从0到10。通过余再做一个转换,即可得到相应的第18位上的校验码,余数和校验码的转换如下:

    余数                     0     1     2     3     4     5     6     7     8     9     10

    对应的校验码       1     0     X     9     8     7     6     5     4     3     2

    下面我们来计算一下一位湖北省襄樊市襄城区在1986年11月9日出生的男性的18位身份证号码,其顺序号假定为321(男性为奇数)。该身份证号前17位为:

    4     2     0     6     8     2     1     9     8     6     1     1     0     9     3     2     1

    先计算前17位与加权因子的积的和除以11的余:



    余数为1则其对应的第18位校验码为0,该男性的18位身份证号码为:

    4     2     0     6     8     2     1     9     8     6     1     1     0     9     3     2     1     0
    @IOS荣天
    校验码可以作为一种判断一个正确的身份证号的前17位是否有错误发生的标准,但这并不一定在任何情况下都是有效的,在某些情况下的错误也是这个校验位无法检测的,比如,多个数字发生错误,例如,当上例中的身份证号码由42068219861109321变为42098219861106321后,其校验码仍为0。 
    举报 222.69.137.* 2009
    展开全文
  • 判断18位身份证正确与否,且不能判断身份证号码和姓名是否对应(要看姓名和号码是否对应,应该有大量的数据库做对比才能实现

    //①根据百度百科中身份证号码的标准实现该方法

    //②该方法只能判断18位身份证,且不能判断身份证号码和姓名是否对应(要看姓名和号码是否对应,应该有大量的数据库做对比才能实现)

    //③直接copy这段代码,就能通过调用这个方法判断身份证号码是否符合标准

    //

    /**

     *  验证身份证号码是否正确的方法

     *

     *  @param IDNumber 传进身份证号码字符串

     *

     *  @return 返回YESNO表示该身份证号码是否符合国家标准

     */

    - (BOOL)idNumberIsCorrect:(NSString *)IDNumber

    {

        //原文少这句判断从而直接崩溃

        if (IDNumber.length <18 ) {

            returnNO;

        }

        NSMutableArray *IDArray = [NSMutableArray array];

        // 遍历身份证字符串,存入数组中

        for (int i =0; i <18; i++) {

            NSRange range = NSMakeRange(i,1);

            NSString *subString = [IDNumber substringWithRange:range];

            [IDArray addObject:subString];

        }

        // 系数数组

        NSArray *coefficientArray = [NSArray arrayWithObjects:@"7",@"9",@"10",@"5",@"8",@"4",@"2",@"1",@"6",@"3",@"7",@"9",@"10",@"5",@"8",@"4",@"2",nil];

        // 余数数组

        NSArray *remainderArray = [NSArray arrayWithObjects:@"1",@"0",@"X",@"9",@"8",@"7",@"6",@"5",@"4",@"3",@"2",nil];

        // 每一位身份证号码和对应系数相乘之后相加所得的和

        int sum =0;

        for (int i =0; i <17; i++) {

            int coefficient = [coefficientArray[i] intValue];

            int ID = [IDArray[i] intValue];

            sum += coefficient * ID;

        }

        // 这个和除以11的余数对应的数

        NSString *str = remainderArray[(sum %11)];

        // 身份证号码最后一位

        NSString *string = [IDNumber substringFromIndex:17];

        // 如果这个数字和身份证最后一位相同,则符合国家标准,返回YES

        if ([strisEqualToString:string]) {

            returnYES;

        } else {

            returnNO;

        }

    }


    想了解具体算法步骤的可以看原文 http://blog.csdn.net/l2i2j2/article/details/51020204 


    展开全文
  • iOS身份证号码识别

    2017-07-10 18:12:08
    from: http://fengdeng.github.io/2016/08/18/iOS%E5%AE%9E%E7%8E%B0%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E7%A0%81%E8%AF%86%E5%88%AB/ ##Begin 这里使用到两个C++的库 OpenCV Tesseract ...

    from: http://fengdeng.github.io/2016/08/18/iOS%E5%AE%9E%E7%8E%B0%E8%BA%AB%E4%BB%BD%E8%AF%81%E5%8F%B7%E7%A0%81%E8%AF%86%E5%88%AB/

    ##Begin

    这里使用到两个C++的库

    1. OpenCV
    2. Tesseract

    OpenCV在这里实现图像处理,Tesseract在这里实现数字识别

    先上效果图:隐私打码谢谢

    ###0x00 获取视频流

    iOS里获取视频流比较简单,当然OpenCV里也有这功能,这里只说前一种。大家可以直接搜 AVCaptureSession,这里我就直接上代码了。

    在回调里获取到图片,并且转化为UIImage

    -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{
        CVImageBufferRef ref = CMSampleBufferGetImageBuffer(sampleBuffer);
        CIImage* ciImage = [[CIImage alloc]initWithCVPixelBuffer:ref];
        CIContext *context = [CIContext contextWithOptions:nil];
        CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];
        UIImage * image = [[UIImage alloc]initWithCGImage:cgImage];
        CGImageRelease(cgImage);
    }
    

    ###0x01 OpenCV处理图片
    集成OpenCV的方法很简单,直接使用Cocospod就可以了。

    pod 'OpenCV', '~> 3.0.0'
    

    OpenCV地址

    这里说下主要的对身份证的处理

    • 灰度图

      cvtColor(dst, dst, COLOR_BGR2GRAY);
      
    • 二值化

      threshold(dst, dst, 80, 255, THRESH_BINARY);
      
    • 腐蚀

      erode(dst,dst,Mat(27,27,CV_8U),Point(-1,-1),2);
      
    • 轮廓检测

      Mat c = dst.clone();
      vector<vector<Point>> contours;
      findContours(c, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE,cvPoint(0, 0));
      //除去太长或者太短的轮廓
      int cmin = 35;
      int cmax = 800;
      vector<std::vector<cv::Point>>::iterator itc = contours.begin();
      while(itc != contours.end())
      {
          Rect rect = boundingRect(*itc);
      
          if(itc->size() < cmin || itc->size() > cmax || rect.width < 40 || rect.height < 40){
              //std::cout << "EraseSize: " << itc->size() << std::endl;
              itc = contours.erase(itc);
              }
          else{
              ++itc;};
      
      }
      
    • 取出身份证号码区域

      vector<Rect> rects;
      Rect rr = Rect(0,0,0,0);
      std::vector<std::vector<cv::Point>>::const_iterator itContours = contours.begin();
      for ( ; itContours!=contours.end(); ++itContours){
          Rect rect = boundingRect(*itContours);
          rects.push_back(rect);
          //std::cout << "Size: " << rect << std::endl;
          if (rect.width > rr.width && rect.width > rect.height * 5) {
              rr = rect;
          }
      }
      

    ###0x02 Tesseract进行数字识别

    集成OpenCV的方法也很简单,直接使用了别人封装好的一个库,当然也可以自己编译直接使用C++的。

    pod 'TesseractOCRiOS', '~> 4.0.0'
    

    GitHub地址

    直接识别

    self.tesseract = [[G8Tesseract alloc] initWithLanguage:@"chi_sim"];
    
    tesseract.charWhitelist = @"0123456789";
    
    self.tesseract.image = [i g8_blackAndWhite];
    
      // Optional: Limit the area of the image Tesseract should recognize on to a rectangle
    self.tesseract.rect = CGRectMake(0, 0, i.size.width, i.size.height);
    
      // Optional: Limit recognition time with a few seconds
    self.tesseract.maximumRecognitionTime = 2.0;
    
      // Start the recognition
    [self.tesseract recognize];
    
      // Retrieve the recognized text
    NSLog(@"识别:%@", [self.tesseract recognizedText]);
    


    展开全文
  • iOS开发自动补全第18位身份证号码的X 不用自定义键盘,使用系统的数字键盘输入身份证号码

    众所周知,大陆的身份证号码是由18位数字组成的,当然也有一个特例就是有些人的身份证号码末位是X。对于iOS开发来说真是蛋疼的要命,用普通键盘样式,字母键盘要和数字键盘切换,明显不利于用户操作,但是用数字键盘吧,又没有X。大多数人肯定就会想直接自定义键盘。这个方法是能解决问题,但是总这么千篇一律的,感觉不到一点新意。我查阅了身份证号码的百度百科后,发现最后一位其实可以通过前17位数字计算出来的。于是我就想出了一个不自定义键盘也能用数字键盘写出身份证号码的方法:当写到17位的时候,如果判断出来该用户的18位为X,则自动补全X,否则依然由用户输入第18位

    // textField代理方法
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        // string.length为0,表明没有输入字符,应该是正在删除,应该返回YES。
        if (string.length == 0) {
            return YES;
        }
        // length为当前输入框中的字符长度
        NSUInteger length = textField.text.length + string.length;
        // 如果该页面中还有其他的输入框,则需要做这个判断
        if (textField == self.idNumberTextField) {
        	// str为当前输入框中的字符
            NSString *str = [NSString stringWithFormat:@"%@%@", textField.text, string];
            // 当输入到17位数的时候,通过theLastIsX方法判断最后一位是不是X
            if (length == 17 && [self theLastIsX:str]) {
            	// 如果是17位,并通过前17位计算出18位为X,自动补全,并返回NO,禁止编辑。
                textField.text = [NSString stringWithFormat:@"%@%@X", textField.text, string];
                return NO;
            }
            // 如果是其他情况则直接返回小于等于18(最多输入18位)
            return length <= 18;
        }
        return YES;
    }
    // 判断最后一个是不是X
    - (BOOL)theLastIsX:(NSString *)IDNumber {
        NSMutableArray *IDArray = [NSMutableArray array];
        for (int i = 0; i < 17; i++) {
            NSRange range = NSMakeRange(i, 1);
            NSString *subString = [IDNumber substringWithRange:range];
            [IDArray addObject:subString];
        }
        NSArray *coefficientArray = [NSArray arrayWithObjects:@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2", nil];
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            int coefficient = [coefficientArray[i] intValue];
            int ID = [IDArray[i] intValue];
            sum += coefficient * ID;
        }
        if (sum % 11 == 2) return YES;
        else return NO;
    }


    展开全文
  • -(BOOL)checkIdCardNoFunc:(NSString *) IDCardNo{ NSString *reg = @"/(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/"; NSPredicate *pred = [NSPredicate predicateWithFormat:@"...
  • iOS判断身份证号码是否正确
  • 直接调用函数即可
  • 工程中输入身份证时,希望的到数字键盘来输入,但是数字键盘中没有x键,该工程完成这部分功能。通过代理实现,便于移植和优化.
  • + (BOOL)validateIDCardNumber:(NSString *)value {  value = [value stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];    int length =0;  if (!value) {
  • 自定义照相机通过设备摄像头实时获取身份证图片信息,然后识别图片中身份证号码,采用ocr识别数字 声明import import import import “MBProgressHUD.h”//#import “Tesseract.h” @protocol PassImage -(void)...
  • //根据身份证号获取生日 -(NSString *)birthdayStrFromIdentityCard:(NSString *)numberStr { NSMutableString *result = [NSMutableString stringWithCapacity:0]; NSString *year = nil; NSString *month = ...
  • 身份证号码15位补齐18 因为项目业务需要,对身份证有一个验证的过程,所以需要考虑很多方面的因素,就比如需要考虑到老一辈人还在使用旧的15位身份证,但是旧的身份证没有具体的验证代码,那只能从补齐18进行...
  • 代码如下:   ? 1 2 3 4 5 6 7 ...15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
  • iOS 判断身份证号码

    2016-06-21 09:27:41
    //判断身份证号码 + (BOOL)validateIdentityCard: (NSString *)identityCard; //精确判断身份证号码 + (BOOL)validateIDCardNumber:(NSString *)identityCard; //身份证号 + (BOOL)...
  • ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂 粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013年1月1...
  • iOS身份证键盘

    2016-08-09 10:36:53
    iOS身份证键盘 - JYJKeyBoardgitHub地址 https://github.com/jiangyongjian/JYJKeyBoard需求是灵活的,人也是灵活的。经常在项目中遇到要输入身份证,但是恶心的是,有个X。下文是自己在系统的键盘上加了个X,给用户...
  • #pragma mark - 手机号识别 - (BOOL)isMobileNumber:(NSString *)phone {   NSString * MOBILE = @"^(0|86|...(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$";   NSPredicate *regextestmobil
  • 这次项目对身份证的输入验证要求比较高, 因此在网上多方搜查资料,得到了超严谨的身份证验证正则(外加一点点判断), 现进行记录,以便后续使用,如下: //HTML部分 &amp;amp;amp;lt;input type='text' id=...
  • iOS开发之身份证号码的验证
  • 最近项目用到身份证识别,在github上搜了一堆demo,在Google上找了一堆代码,有能识别出证件照的,但是都是打包成.a的静态库,没有源码,我努力吃了几天书,有了一点研究成果,现在贴出来与大家分享,要是有更好的...
1 2 3 4 5 ... 20
收藏数 6,365
精华内容 2,546
关键字:

15位身份证号码 ios