身份证 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
#include <iostream>
#include <string.h>
using namespace std;

char cnid18crc(const char *id18); // 身份证 最后一位校验位
void cnid_15to18(char *id18 , const char *id15); // 身份证 15位升级18

int main()
{
char cnid15[19] = "340524800101001";
char cnid18[19] ;
cnid_15to18(cnid18, cnid15);

cout << cnid15 << endl;
cout << cnid18 << endl;
return 0;
}

// 身份证 最后一位校验位
char cnid18crc(const char *id18)
{
int sigma = 0;
int a[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char w[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

for (int i = 0; i < 17; i++) {
int ai = id18[i] - '0';
int wi = a[i];
cout << ai << " * " << wi << "\t= " << (ai * wi) << endl;
sigma += (ai * wi);
}
int number = sigma % 11;
cout << w[number] << " ---->\t " << sigma << " mod 11 = " << number << endl ;

return w[number];
}

// 身份证 15位升级18
void cnid_15to18(char *id18 , const char *id15)
{
char *ps = id18 + 2;
strcpy(ps , id15);
strncpy(id18 , id15 , 6);
id18[6] = '1';
id18[7] = '9';
id18[17] = 'C';
id18[18] = '\0';

id18[17] = cnid18crc(id18);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
3 * 7   = 21
4 * 9 = 36
0 * 10 = 0
5 * 5 = 25
2 * 8 = 16
4 * 4 = 16
1 * 2 = 2
9 * 1 = 9
8 * 6 = 48
0 * 3 = 0
0 * 7 = 0
1 * 9 = 9
0 * 10 = 0
1 * 5 = 5
0 * 8 = 0
0 * 4 = 0
1 * 2 = 2
X ----> 189 mod 11 = 2
340524800101001
34052419800101001X
// 运行结果,加权因子,校验码表
int a[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char w[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};