Правильный алгоритм 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");