身份证校验算法(C语言)

/*
身份证校验算法:
根据各位的权重,求得校验和
对校验和取余(11),求得校验序号
根据校验序号,找到对应的校验码
身份证号最后一位为校验码
*/

#include <stdio.h>

int g_IDCard[18]={0};

int g_Factor[17]={7, 9, 10, 5, 8,4, 2, 1, 6, 3,7, 9, 10, 5, 8,4, 2};    //身份证号从左到右各位的权重

char Validate[11]={'1', '0', 'X', '9', '8','7', '6', '5', '4', '3','2'};    //身份证号最后一位的校验码

int CaluIDCheckNumber()     //根据各位权重,求得验证和
{
    int nRet = 0;

    for(int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0])- 1; i++)
    {
        nRet += g_IDCard[i] * g_Factor[i];
    }
    return nRet % 11;
}

void ConvertStr2IDAry(char* strID)  //将身份证号的字符串转换为数组并进行运算
{
    for(int i = 0; i < sizeof(g_IDCard) / sizeof(g_IDCard[0])-1; i++)
    {
        g_IDCard[i] = strID[i] - '0';
    }
}

int IsIDNumberValidated(char* strIDNmuber)      //将身份证号的验证码跟算出的验证序号比较
{
    ConvertStr2IDAry(strIDNmuber);
    int nValue = CaluIDCheckNumber();
    if(Validate[nValue] == strIDNmuber[17])
        return 1;
    else
        return 0;
}

int main(int argc, char* argv[])
{
    char IDNumber[19] = {'0'};
    gets(IDNumber);

    if(IsIDNumberValidated(IDNumber))
    {
        printf("合格\r\n");
    }
    else
    {
        printf("失败\r\n");
    }
}

原文地址:https://www.cnblogs.com/zonkidd/p/12293658.html

时间: 2024-10-17 11:24:56

身份证校验算法(C语言)的相关文章

身份证校验

1 namespace CheckIdenoDemo 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Console.WriteLine("请输入您的18位身份证号码:"); 8 string readstring = Console.ReadLine(); 9 10 IdentifyCheck idenCheck = new IdentifyCheck(); 11 12 idenCheck.Identit

C语言中的校验算法

数据通信的校验算法核心思想:为了保证通讯数据的可靠性,通常加入校验来验证一帧数据是否有误,校验的方式有很多种,异或校验是常见的一种,你这个如2楼说的,是逐字节进行按位异或运算,结果放在最后一个字节,接收方收到数据进行同样计算,如果最后一个字节和计算结果一致,则可认为这一帧数据可信.

校验算法之二进制反码求和

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤:    (1)把IP数据报的首部都置为0,包括校验和字段.    (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和.    (3)把得到的结果存入校验和字段中.    在接收数据时,计算数据报的校验和相对简单,按如下步骤:    (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段.    (2)检查计算出的校验和

中国大陆新身份证号码算法

1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 2.地址码 表示编码对象常住户口所在县(市.旗.区)的行政区划代码,按GB/T2260的规定执行.(所有区域的编码可以到这个网站http://www.stats.gov.cn/tjbz/index.htm查询到最新的县及县以上的行政编码资料.) 3.出生日期码 表示编码对象出生的年.月.日,按GB/T7408的规定执行,年.月

RSA算法C语言实现

RSA算法C语言实现 一.源文件三个rsa.h , rsa.c , main.c //rsa.h #include <stdio.h> #define MAX_NUM 63001 #define MAX_PRIME 251 //! 返回代码 #define OK 100 #define ERROR_NOEACHPRIME 101 #define ERROR_NOPUBLICKEY 102 #define ERROR_GENERROR 103 unsigned int MakePrivatedK

关于校验算法的学习(学习以太网时遇到的)

关于校验算法的学习(学习以太网时遇到的)以太网的包头还是数据都会有校验,在FPGA上实现IP核时,用的是CRC校验,然后学习ICMP协议时,也看到一种校验算法,以此学习分析一下背后原理. 一.先看看ICMP的包格式,主要是写ping命令是用到(会有一篇专门将ping的c语言实现),所以只是展示与ping命令背后的ICMP规则. (来自维基) 对于校验的研究暂时不需要理解其他数据的意思,维基对checksum的解释为 Checksum Error checking data, calculated

身份证校验原理和PHP实现

原文地址:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21126994&id=3938244 关于身份证的校验算法问题 身份证15位升级到18位,原来年用2位且没有最后一位,从左到右方分别表示 ①1-2 升级行政区代码 ②3-4 地级行政区划分代码 ③5-6 县区行政区分代码 ④7-10 11-12 13-14 出生年.月.日 ⑤15-17 顺序码,同一地区同年.同月.同日出生人的编号,奇数是男性,偶数是女性 ⑥18 校验

GSM07.10协议中串口复用使用的校验算法

1 const static unsigned char __crctable[256] = 2 { 3 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 4 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B, 5 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 6 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,

java实现身份证校验

原文来自:java教程网 题目:身份证校验 身份证校验 如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以! 因为有人的身份证最后一位是"X" 实际上,除了最后一位的X,不会出现其它字母! 身份证号码18位 = 17位 + 校验码 校验码的计算过程: 例如:身份证前17位 = ABCDEFGHIJKLMNOPQ A~Q 每位数字乘以权值求和(每位数字和它对应的“权”相乘后累加) 17位对应的权值分别是: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8