0

我正在使用 Visa 信用卡生成器,但没有看到以下问题:我的代码似乎适用于 16 位数的卡号,但是,它似乎不适用于 13 位数的卡,因为生成的卡在线测试人员和我的应用程序上的数字均无效。

代码:

var randomNum = new Random();
int [] lengths = new int[] { 13, 16 };
int length = lengths[randomNum.Next(lengths.Length)];
int [] str;
int [] reversed;
var lastDigit = 0;
var sum = 0;

if (length == 16)
{
    str = new int[16];
    reversed = new int[15];
}
else
{
    str = new int[13];
    reversed = new int[12];
}

Random rnd = new Random();
while (pos < length - 1)
{
    str[pos++] = rnd.Next(0, 9);
}

for (int i = 0; i < str.Length - 1; i++)
{
    reversed[i] = str[str.Length - i - 2];
}

for (pos = 0; pos < length - 1; pos++)
{
    if (pos % 2 == 0 && length == 16)
    {
        reversed[pos] *= 2;
        if (reversed[pos] > 9)
            reversed[pos] = reversed[pos] - 9;
    }
    else if (pos % 2 == 1 && length == 13)
    {
        reversed[pos] *= 2;
        if (reversed[pos] > 9)
            reversed[pos] = reversed[pos] - 9;
    }

    sum += reversed[pos];
}

lastDigit = (10 - (sum % 10)) % 10;
str[length - 1] = lastDigit;

我为复制整个代码道歉,但我认为这会让事情更容易理解。

我从http://www.freeformatter.com/credit-card-number-generator-validator.html遵循的算法:

  • 删除数字的最后一位数字。最后一位是我们要检查的
  • 颠倒数字
  • 将奇数位(1、3、5 等)的数字乘以 2,然后将所有大于 9 的结果减去 9
  • 将所有数字加在一起
  • 校验位(卡的最后一个数字)是您需要添加以获得 10 的倍数(模 10)的金额

我的代码生成的示例卡号:

  • 16 位:4145422641287432 - 有效
  • 13 位:4354735186403 - 无效(添加校验位之前的总和为 47,这意味着 3 将是校验位,导致总和为 50 => 50%10=0)

我在这里到底做错了什么?

4

0 回答 0