C# 正确的ICCID算法

C# 正确的ICCID算法,c#,iccid,C#,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)(d

我需要验证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;
}
但对于100%正确的ICCID 8914800005339755555,它返回false。哪里可以买到真正的ICCID算法? 谢谢

根据,ICCID使用

您发现的代码有点不正确,因为它假定该值有奇数个数字、偶数个正常数字,再加上1个校验位。它从最左边的数字开始解析值,并假设示例中最左边的数字8没有加倍,下一个数字9加倍。但如果该值的位数为偶数,则这是不正确的。在你的情况下,8应该是双倍的

谢天谢地,使用维基百科页面作为参考,我们自己很容易实现Luhn算法:

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");

.

我不理解你的问题。首先,你是否调试过这段代码,如果没有,我强烈推荐。第二,如果我是正确的,你想验证ICCID,对吗?第三,根据您发现正确的算法,您的输出不正确?你还要求一个真正的ICCID算法这意味着什么?你调试了代码并检查了哪个计算没有按照预期给出结果吗?@Codexer如果这个算法没有检查代码就返回了有效ICCID的“false”,我建议参考ICCID本身,看看它是如何构建的。它由18-22个字符17到21+1个校验位组成。在您的例子中,假设长度是静态的18位数字。您可以找到关于这个的答案。它返回00000000000000的pass。对于luhn algo来说,这可能是正确的值,但对于业务流程来说并不合适:如果您阅读了luhn算法,这是正确的。它在Wiki页面的“赞成/反对”部分中明确指出