如何解决正确的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 算法?
谢谢
解决方法
根据 Wikipedia,ICCID 使用 Luhn algorithm。
您找到的代码有点损坏,因为它假定该值具有奇数位数(偶数个正常位数,加上 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");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。