IMEI 未通过 Luhn 校验和
IMEI not passing Luhn Checksum
我有以下用于验证 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');
}
除了我的 Samsung Galaxy Note 4 外,几乎每个 IMEI 都已检查。
我不想 post 出于显而易见的原因,但同时我需要有人验证它是否有效。
可能是我的实现方式不对。
请帮忙。
在 *2
操作后,您在 Luhn algo
中遗漏了一个点,它是
- 如果数字是
>=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'
另一种选择是使用 Apache Commons.
中的库
org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(imei)
我有以下用于验证 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');
}
除了我的 Samsung Galaxy Note 4 外,几乎每个 IMEI 都已检查。
我不想 post 出于显而易见的原因,但同时我需要有人验证它是否有效。
可能是我的实现方式不对。
请帮忙。
在 *2
操作后,您在 Luhn algo
中遗漏了一个点,它是
- 如果数字是
>=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'
另一种选择是使用 Apache Commons.
中的库org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(imei)