Правильный алгоритм ICCID

Мне нужно проверить ICCID, я нашел только один алгоритм:

      int numberStringLength = 18;

int cs = 0;
int dodd;
for (int i = 0; i < numberStringLength; i += 2)
{
    dodd = Convert.ToInt32(iccid.Substring(i + 1, 1)) << 1;
    cs += Convert.ToInt32(iccid.Substring(i, 1)) + (int)(dodd / 10) + (dodd % 10);
}
cs = (10-(cs % 10)) % 10;

if (cs == Convert.ToInt32(iccid.Substring(numberStringLength, 1)))
{
    return true;
}
else
{
    return false;
}

но он возвращается falseдля 100% правильного ICCID (89148000005339755555). Где я могу получить настоящий алгоритм ICCID? Спасибо

1 ответ

Согласно Википедии , ICCID используют алгоритм Луна .

Ваш код, который вы нашли, немного поврежден, так как он предполагает, что значение имеет нечетное количество цифр (четное количество обычных цифр плюс 1 контрольная цифра). Он начинает анализ значения с самой левой цифры и предполагает, что эта самая левая цифра («8» в вашем примере) не удваивается, а следующая («9») удваивается. Но это неверно, если значение имеет четное количество цифр. В вашем случае цифра «8» должна быть удвоена.

К счастью, очень легко реализовать алгоритм Луна самостоятельно, используя эту страницу в Википедии в качестве ссылки:

      string input = "89148000005339755555";

int sum = 0;
// We'll use index i = 0 means the right-most digit, i = 1 is second-right, etc
for (int i = 0; i < input.Length; i++)
{
    // Get the digit at the i'th position from the right
    int digit = int.Parse(input[input.Length - i - 1].ToString());

    // If it's in an odd position (starting from the right), then double it.
    if (i % 2 == 1)
    {
        digit *= 2;

        // If it's now >= 10, subtract 9
        if (digit >= 10)
        {
            digit -= 9;
        }
    }

    sum += digit;
}

// It's a pass if the result is a multiple of 10
bool pass = sum % 10 == 0;
Console.WriteLine(pass ? "Pass" : "Fail");

Смотрите на dotnetfiddle.net .

Другие вопросы по тегам