国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - IOS 身份證校驗詳細介紹及示例代碼

IOS 身份證校驗詳細介紹及示例代碼

2021-02-28 14:39Jack__Long IOS

這篇文章主要介紹了IOS 身份證校驗詳細介紹及示例代碼的相關資料,這里對身份校驗比較詳細,附有簡單實例,需要的朋友可以參考下

IOS 身份證校驗

身份證基礎知識:

身份證是國民的身份編號,編號是有一定規律的,這里介紹身份證驗證規則比較詳細。項目中經常會需要對身份證進行校驗,我們先了解一些基本知識,然后分析代碼

居民身份證號碼,根據〖中華人民共和國國家標準 GB 11643-1999〗中有關公民身份號碼的規定,公民身份號碼是特征組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。 居民身份證是國家法定的證明公民個人身份的有效證件。

結構和形式

1.號碼的結構

   公民身份號碼是特征組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。

2.地址碼

   表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼,按GB/T2260的規定執行。

3.出生日期碼

   表示編碼對象出生的年、月、日,按GB/T7408的規定執行,年、月、日代碼之間不用分隔符。

4.順序碼

   表示在同一地址碼所標識的區域范圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。

5.校驗碼

  根據前面十七位數字碼,按照ISO7064:1983.MOD11-2校驗碼計算出來的檢驗碼。

地址碼

華北地區: 北京市|110000,天津市|120000,河北省|130000,山西省|140000,內蒙古自治區|150000,

東北地區: 遼寧省|210000,吉林省|220000,黑龍江省|230000,

華東地區: 上海市|310000,江蘇省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山東省|370000,

華中地區: 河南省|410000,湖北省|420000,湖南省|430000,

華南地區: 廣東省|440000,廣西壯族自治區|450000,海南省|460000,

西南地區: 重慶市|500000,四川省|510000,貴州省|520000,云南省|530000,西藏自治區|540000,

西北地區: 陜西省|610000,甘肅省|620000,青海省|630000,寧夏回族自治區|640000,新疆維吾爾自治區|650000,

特別地區:臺灣地區(886)|710000,香港特別行政區(852)|810000,澳門特別行政區(853)|820000

中國大陸居民身份證號碼中的地址碼的數字編碼規則為:

第一、二位表示省(自治區、直轄市、特別行政區)。

第三、四位表示市(地級市、自治州、盟及國家直轄市所屬市轄區和縣的匯總碼)。其中,01-20,51-70表示省直轄市;21-50表示地區(自治州、盟)。

第五、六位表示縣(市轄區、縣級市、旗)。01-18表示市轄區或地區(自治州、盟)轄縣級市;21-80表示縣(旗);81-99表示省直轄縣級市。

生日期碼

  (身份證號碼第七位到第十四位)表示編碼對象出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。例如:1981年05月11日就用19810511表示。

順序碼

  (身份證號碼第十五位到十七位)地址碼所標識的區域范圍內,對同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性

校驗碼

       作為尾號的校驗碼,是由號碼編制單位按統一的公式計算出來的,如果某人的尾號是0-9,都不會出現X,但如果尾號是10,那么就得用X來代替,因為如果用10做尾號,那么此人的身份證就變成了19位,而19位的號碼違反了國家標準,并且中國的計算機應用系統也不承認19位的身份證號碼。Ⅹ是羅馬數字的10,用X來代替10,可以保證公民的身份證符合國家標準。

身份證校驗碼的計算方法

1、將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、將這17位數字和系數相乘的結果相加。
3、用加出來和除以11,看余數是多少?
4、余數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最后一位身份證的號碼為1-0-X-9-8-7-6-5-4-3-2。(即余數0對應1,余數1對應0,余數2對應X...)
5、通過上面得知如果余數是3,就會在身份證的第18位數字上出現的是9。如果對應的數字是2,身份證的最后一位號碼就是羅馬數字x。

例如:某男性的身份證號碼為【53010219200508011x】,我們看看這個身份證是不是合法的身份證。
首先我們得出前17位的乘積和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的結果是189/11=17----2,也就是說其余數是2。最后通過對應規則就可以知道余數2對應的檢驗碼是X。所以,可以判定這是一個正確的身份證號碼。

有了上面的基礎知識點,下面具體看一下實現代碼

18位身份證驗證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
48
49
50
51
52
53
-(BOOL)checkUserIDCard:(NSString *)userID
{
  //長度不為18的都排除掉
  if (userID.length!=18) {
    return NO;
  }
   
  //校驗格式
  NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
  NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
  BOOL flag = [identityCardPredicate evaluateWithObject:userID];
   
  if (!flag) {
    return flag;  //格式錯誤
  }else {
    //格式正確在判斷是否合法
    //將前17位加權因子保存在數組里
    NSArray * idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
     
    //這是除以11后,可能產生的11位余數、驗證碼,也保存成數組
    NSArray * idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
     
    //用來保存前17位各自乖以加權因子后的總和
    NSInteger idCardWiSum = 0;
    for(int i = 0;i < 17;i++){
      NSInteger subStrIndex = [[userID substringWithRange:NSMakeRange(i, 1)] integerValue];
      NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
      idCardWiSum+= subStrIndex * idCardWiIndex;
    }
     
    //計算出校驗碼所在數組的位置
    NSInteger idCardMod=idCardWiSum%11;
     
    //得到最后一位身份證號碼
    NSString * idCardLast= [userID substringWithRange:NSMakeRange(17, 1)];
     
    //如果等于2,則說明校驗碼是10,身份證號碼最后一位應該是X
    if(idCardMod==2){
      if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){
        return YES;
      }else{
        return NO;
      }
    }else{
      //用計算出的驗證碼與最后一位身份證號碼匹配,如果一致,說明通過,否則是無效的身份證號碼
      if([idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]){
        return YES;
      }else{
        return NO;
      }
    }
  }
}

15位和18位身份證驗證

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//正則匹配用戶身份證號15或18位
-(BOOL)validateIDCardNumber:(NSString *)value {
 
  value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  NSInteger length =0;
  if (!value) {
    return NO;
  }else {
    length = value.length;
    //不滿足15位和18位,即身份證錯誤
    if (length !=15 && length !=18) {
      return NO;
    }
  }
  // 省份代碼
  NSArray *areasArray = @[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41", @"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];
   
  // 檢測省份身份行政區代碼
  NSString *valueStart2 = [value substringToIndex:2];
  BOOL areaFlag =NO; //標識省份代碼是否正確
  for (NSString *areaCode in areasArray) {
    if ([areaCode isEqualToString:valueStart2]) {
      areaFlag =YES;
      break;
    }
  }
   
  if (!areaFlag) {
    return NO;
  }
   
  NSRegularExpression *regularExpression;
  NSUInteger numberofMatch;
   
  int year =0;
  //分為15位、18位身份證進行校驗
  switch (length) {
    case 15:
      //獲取年份對應的數字
      year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
     
      if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
        //創建正則表達式 NSRegularExpressionCaseInsensitive:不區分字母大小寫的模式
        regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
          options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
      }else {
        regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
        options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
      }
      //使用正則表達式匹配字符串 NSMatchingReportProgress:找到最長的匹配字符串后調用block回調
      numberofMatch = [regularExpression numberOfMatchesInString:value
                                options:NSMatchingReportProgress
                                 range:NSMakeRange(0, value.length)];
       
      if(numberofMatch >0) {
        return YES;
      }else {
        return NO;
      }
    case 18:
      year = [value substringWithRange:NSMakeRange(6,4)].intValue;
      if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
        regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$" options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
      }else {
        regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$" options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
      }
      numberofMatch = [regularExpression numberOfMatchesInString:value
                                options:NSMatchingReportProgress
                                 range:NSMakeRange(0, value.length)];
       
       
      if(numberofMatch >0) {
        //1:校驗碼的計算方法 身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。將這17位數字和系數相乘的結果相加。
         
        int S = [value substringWithRange:NSMakeRange(0,1)].intValue*7 + [value substringWithRange:NSMakeRange(10,1)].intValue *7 + [value substringWithRange:NSMakeRange(1,1)].intValue*9 + [value substringWithRange:NSMakeRange(11,1)].intValue *9 + [value substringWithRange:NSMakeRange(2,1)].intValue*10 + [value substringWithRange:NSMakeRange(12,1)].intValue *10 + [value substringWithRange:NSMakeRange(3,1)].intValue*5 + [value substringWithRange:NSMakeRange(13,1)].intValue *5 + [value substringWithRange:NSMakeRange(4,1)].intValue*8 + [value substringWithRange:NSMakeRange(14,1)].intValue *8 + [value substringWithRange:NSMakeRange(5,1)].intValue*4 + [value substringWithRange:NSMakeRange(15,1)].intValue *4 + [value substringWithRange:NSMakeRange(6,1)].intValue*2 + [value substringWithRange:NSMakeRange(16,1)].intValue *2 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
         
        //2:用加出來和除以11,看余數是多少?余數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字
        int Y = S %11;
        NSString *M =@"F";
        NSString *JYM =@"10X98765432";
        M = [JYM substringWithRange:NSMakeRange(Y,1)];// 3:獲取校驗位
        //4:檢測ID的校驗位
        if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {
          return YES;
        }else {
          return NO;
        }
         
      }else {
        return NO;
      }
    default:
      return NO;
  }
}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/longshihua/article/details/53572251

延伸 · 閱讀

精彩推薦
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩精品专区在线影院重磅 | 一级欧美| 久久精品国产亚洲 | 亚洲视频精品 | 欧美一区二区免费在线观看 | 国产精品一区一区三区 | 国产免费一区二区三区 | 91电影在线 | 免费成人高清在线视频 | 亚洲欧美在线观看 | 欧美日韩精品一区二区三区 | av天天干| 欧美综合第一页 | 欧美setu| 精品国产乱码久久久久久1区2区 | 久久综合av | 一区二区在线不卡 | 韩国精品一区二区三区 | 国产成人精品综合 | 日本黄色网址大全 | 国产综合精品 | 欧美黄色a视频 | 亚洲精品午夜 | 做视频免费观看网站 | 黑人巨大精品欧美黑白配亚洲 | 中文字幕成人 | 久久久久久一区 | 九九精品视频在线观看 | 99中文字幕 | 午夜视频播放 | 亚洲第一视频网站 | 欧美日韩精品在线播放 | 成人日韩av| 亚洲一区二区精品在线观看 | 极品一区| 久草免费在线 | 日韩在线一区二区 | 羞羞的网站| 国产乱码一区二区三区 | 欧美精品在线一区二区三区 | 粉嫩一区二区三区 |