首页 > 编程资源分享区 > C/C++源代码共享 > 身份证15位到18位升级程序
2008
08-25

身份证15位到18位升级程序

玩玩!
[code]
/*************************************************************/
/* 身份证15位转18位                                          */
/* by xstar.wxb                                              */
/* @2008-08-25                                               */
/* 升位算法                                                  */
/*   15位身份证号码                                          */
/*    6位地区码+6位出生年月日+3位顺序码(男为奇数,女为偶数)  */
/*   18位身份证号码                                          */
/*    扩充6位出生年月日为8位出生年月日(年从2位扩充为4位)     */
/*    扩充后的号码计算校验值,mod11当做第18位                */
/*    6位地区码+8位出生年月日+3位顺序码+1位校验位            */
/* 校验算法                                                  */
/*   前17位分别乘加权值,求和,取模(mod11),通过校验列表取得 */
/*   校验位                                                  */
/*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/*************************************************************/
/* 身份证15位转18位                                          */
/* 输入参数: inbuf    15位身份证号码                         */
/* 输出参数: outbuf   18位身份证号码                         */
/* 返 回 值: int      0   转换正常                           */
/*                    -1  输入身份证号码位数错误             */
/*************************************************************/
int id15to18( char *inbuf, char *outbuf );


int main( int argc, char **argv )
{
 char inbuf[ 32 ];
 char outbuf[ 32 ];


 if (argc != 2)
 {
  printf( "idconvert by xstar.wxb @ 2008-08-25\n\n" );
  printf( "USAGE: idconvert idnum\n" );


  return 0;
 }


 strcpy( inbuf, argv[ 1 ] );


 id15to18( inbuf, outbuf );


 printf( "idconvert by xstar.wxb @ 2008-08-25\n\n" );
 printf( "From: %s\nTo  : %s\n", inbuf, outbuf );


 return 0;
}


/*************************************************************/
/* 身份证15位转18位                                          */
/*************************************************************/
int id15to18( char *inbuf, char *outbuf )
{
 /* 和 */
 int sum;
 /* 各位加权值 */
 int wi[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
 /* 各个校验位 */
 char vc[] = "10X98765432";


 /* 判断长度是否符合 */
 if (strlen( inbuf ) != 15)
 {
  return -1;
 }


 /* 复制地区码 */
 for (int i = 0; i < 6; i++)
 {
  outbuf[ i ] = inbuf[ i ];
 }


 /* 扩充出生年 */
 outbuf[ 6 ] = '1';
 outbuf[ 7 ] = '9';


 /* 复制剩下的位 */
 for (int i = 6; i < 15; i++)
 {
  outbuf[ i + 2 ] = inbuf[ i ];
 }


 /* 求和 */
 sum = 0;


 for (int i = 0; i < 17; i++)
 {
  sum += (int)(outbuf[ i ] - '0') * wi[ i ];
 }


 /* 计算校验位 */
 outbuf[ 17 ] = vc[ sum % 11 ];
 outbuf[ 18 ] = '\0';


 return 0;
}
[/code]


身份证15位到18位升级程序》有 2 条评论

  1. hiroki 说:

    感谢楼主啊

  2. yy_uestc 说:

    自学 还没有看到指针那一节!!

    看起来有点困难.

留下一个回复