2

我有以下代码用于验证 IMEI(不是 SV)

public static boolean luhnc(char[] digits) {
    int sum = 0, s = 0;
    for (int i = 0; i < digits.length - 1; i += 2) {
        s = (digits[i+1] - '0') * 2;
        sum += (s > 10 ? s - 9 : s) + (digits[i] - '0');
    }
    return 10 - (sum % 10) == (digits[digits.length-1] - '0');
}

除了我的三星 Galaxy Note 4 之外,几乎所有的 IMEI 都可以检查。

出于明显的原因,我不想在这里发布它,但同时我需要有人来验证它是否有效。

也许是我的实现不对。

请帮忙。

4

2 回答 2

1

另一种选择是使用来自Apache Commons的库。

org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(imei)

于 2018-06-20T18:05:37.963 回答
1

Luhn algo做完*2手术后有一点漏掉了

  • 如果数字是>=10(而不是>),因为10变成0而不是1

所以像这样修复(我将它提取到一个新行中以便您清楚):

for (int i = 0; i < digits.length - 1; i += 2) {
    s = (digits[i + 1] - '0') * 2;                 
    sum += (s >= 10 ? s - 9 : s) + (digits[i] - '0');
}

另外我建议使用 aint[]而不是char[]删除- '0'到处

于 2017-09-09T15:16:42.290 回答