java - IMEI 未通过 Luhn 校验和

标签 java checksum imei luhn

我有以下代码用于验证 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 均已检查。

由于显而易见的原因,我不想将其发布在这里,但同时我需要有人验证它是否有效。

也许是我的实现不正确。

请帮忙。

最佳答案

在执行*2操作后,您在Luhn算法中错过了一点,它是

  • 如果数字是 >=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');
}

此外,我建议使用 int[] 而不是 char[] 来删除各处的 - '0'

关于java - IMEI 未通过 Luhn 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46131868/

相关文章:

java - 读取数据的数组映射

wifi - 如何计算IEEE 802.11 CRC-32 FCS?

android - 如何在 ionic 2 移动应用程序中获取 IMEI 号码?

java - 如何让 Facebook 上的所有 friend 都点赞?

java - 该内容无法在框架中显示

java - Hibernate (lucene) 搜索中的 And 运算符

java - 简单的校验和算法

vb.net - 如何在 vb.net 中加速 MD5 校验和的生成?

java - 获取设备唯一ID

android - 我在 Android Q 中将 IMEI 设为空?