19位银行卡卡号检验源代码
来源:互联网 发布:淘宝怎么给买家评价 编辑:程序博客网 时间:2024/06/11 18:59
根据《中国银联2.0》标准 - Q/CUP 002-2004 提供的算法
Luhn计算模10“隔位2倍加”校验数的公式
计算步骤如下:
步骤1:从右边第1个数字(低序)开始每隔一位乘以 2 。
步骤2:把在步骤1中获得的乘积的各位数字与原号码中未乘2的各位数字相加。
步骤3:从邻近的较高的一个以0结尾的数中减去步骤2中所得到的总和
[这相当于求这个总和的低位数字(个位数)的“ 10的补数 ”],
如果在步骤2得到的总和是以零结尾的数(如30、40等等),则校验数字就是零。
[例]:
无校验数的卡号655002 0001 00000328 步骤
6 5 5 0 0 2 0 0 0 1 0 0 0 0 0 3 2 8 1
x2 x2 x2 x2 x2 x2 x2 x2 x2
10 0 4 0 2 0 0 6 16
6 + 1 + 0 + 5 + 0 + 0 + 4 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 6 + 2 + 1 + 6 = 33 2
40 – 33 = 7 3
即校验为 7
带有校验数的卡号为:655002 0001 00000328 7
(银联要求的卡号是13-19位,此程序暂时满足19位卡号的计算,19位以下的有待修改)
功能:检查19位的银行卡号码的有效性
运行环境:Red Hat Enterprise Linux AS release 3 、AIX Version 5 操作系统上测试通过
编译命令:cc -o card card.c
执行命令:./card
源代码:
/************************************************************
FileName: card.c
Author: yuanfen127
Date: 2005年12月01日
Description: 银行卡号码的有效性检查程序
Version: 1.0
Function List:
1. int CreatBit(char *cdno, int length) 根据前面length-1位长度生成最后校验位
2. int iCheckBit(char *sbuf) 调用CreateBit生成校验位和输入的比较
History:
<author> <time> <version > <desc>
***********************************************************/
#include <stdio.h>
#include <string.h>
main()
{
char card_no[20];
printf("请输入19位卡号:");
scanf("%19s",card_no);
printf("卡号:%s/n",card_no);
/*CreatBit(card_no,strlen(card_no)-1);*/
if ( strlen(card_no) < 19 )
{
printf("卡号长度错误/n");
return -1;
}
if ( 0 != iCheckBit(card_no) )
{
printf("卡号错误!/n");
}
else
{
printf("卡号正确!/n");
}
}
int CreatBit(char *cdno, int length)
{
int CI[18]={1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2};
int i,d,result;
int chk_dig=0;
if ( strlen(cdno) < length)
{
printf("输入的长度错,长度=%d/n",strlen(cdno));
return -1;
}
for ( i=0; i<length; i++ )
{
d = cdno[i]-48;
result = d * CI[i];
chk_dig += result/10 + result%10;
}
chk_dig = 10 - chk_dig%10;
chk_dig = (chk_dig==10) ? 0 : chk_dig;
cdno[length] = chk_dig + 48;
printf("检验位:%d/n",chk_dig);
return 0;
}
int iCheckBit(char *sbuf)
{
char cardbuf[19];
int l_len;
memcpy( cardbuf, sbuf, 19 );
l_len = strlen(sbuf);
l_len = l_len > 19 ? 19 : l_len ;
if( (CreatBit(cardbuf, l_len - 1 ) != 0) || memcmp(sbuf, cardbuf, l_len))
{
return(-1);
}
return(0);
}
- 19位银行卡卡号检验源代码
- 银行卡卡号检验位
- Js实现16/19位银行卡号前端校验
- Java语言实现Luhn算法检验银行卡号
- Luhn算法(模10算法)检验银行卡号正确性
- 校验银行卡号正确性的oracle源代码
- 自动格式化银行卡号的EditText,每四位增加一个空格,并根据银行卡号判断该银行卡归属的银行及卡别
- C随机生成18位银行卡号
- 银行卡号4位分隔JS
- 银行卡号每隔4位插入空格
- 银行卡号4位一空格
- 银行卡号4位分隔JS
- 银行卡编码规则及检验算法详解
- Android 笔记:识别银行卡,获取银行卡卡号
- 银行卡前台展示+后台字符串处理+银行卡卡号验证
- 银行卡号 输入4位自动加入空格符
- JS输入银行卡号,4位自动加空格
- Android 模拟支付宝银行卡号输入四位空格
- C# 学习笔记 -- 第六天 正规表达式
- 今天终于把程序运行起来了,高兴!
- 平安夜,练练打字
- 好久没听歌了。
- Google中国编程挑战赛第一轮
- 19位银行卡卡号检验源代码
- Google工程师详述Google的搜索结果排列算法 (ZT)
- struts开发 实践—实用小贴士
- 采用HttpServlet 实现web文件下载
- http://www.torrentz.com
- ultraGrid打印预览对话框汉化
- Open my Blog,Open my world!
- [转贴]:白祺瑞的作品
- 软件定位很重要(ZT)