是否可以验证IMEI号码?

时间:2014-08-10 14:37:49

标签: c vb.net imei

对于移动商店应用程序,我需要验证IMEI number。我知道如何基于输入长度进行验证,但是他们是否有其他任何验证输入数字的机制?有没有可以实现这一目标的内置功能?

接受并赞赏任何语言的逻辑。

5 个答案:

答案 0 :(得分:22)

搜索表明,没有内置功能可验证IMEI号,但有一种使用Luhn algorithm的验证方法。

一般过程:

  1. 输入IMEI:490154203237518
  2. 取下最后一位数字,记住它:49015420323751& 8。最后一位数字8是验证数字。
  3. IMEI中的每秒数字加倍:4 18 0 2 5 8 2 0 3 4 3 14 5 2(不包括验证数字)
  4. 将此数字分成单个数字:4 1 8 0 2 5 8 2 0 3 4 3 1 4 5 2(请注意1814已被拆分。
  5. 添加所有数字:4+1+8+0+2+5+8+2+0+3+4+3+1+4+5+2 = 52
  6. 记下结果编号,记住它,然后将其四舍五入到最接近的十位:60
  7. 从舍入后的数字中减去原始数字:60 - 52 = 8
  8. 将结果与原始验证数字进行比较。如果两个数字匹配,则您的IMEI有效。
  9. 上面步骤1中给出的IMEI是有效的,因为步骤#7中找到的数字是8,它与验证数字匹配。

答案 1 :(得分:2)

根据previous answer中的Karl Nicoll,我用Java创建了此方法。

public static int validateImei(String imei) {

    //si la longitud del imei es distinta de 15 es invalido
    if (imei.length() != 15)
        return CheckImei.SHORT_IMEI;

    //si el imei contiene letras es invalido
    if (!PhoneNumber.allNumbers(imei))
        return CheckImei.MALFORMED_IMEI;

    //obtener el ultimo digito como numero
    int last = imei.charAt(14) - 48;

    //duplicar cada segundo digito
    //sumar cada uno de los digitos resultantes del nuevo imei
    int curr;
    int sum = 0;
    for (int i = 0; i < 14; i++) {
        curr = imei.charAt(i) - 48;
        if (i % 2 != 0){
            // sum += duplicateAndSum(curr);
            // initial code from Osvel Alvarez Jacomino contains 'duplicateAndSum' method.
            // replacing it with the implementation down here:
            curr = 2 * curr;
            if(curr > 9) {
                curr = (curr / 10) + (curr - 10);
            }
            sum += curr;
        }
        else {
            sum += curr;
        }

    }

    //redondear al multiplo de 10 superior mas cercano
    int round = sum % 10 == 0 ? sum : ((sum / 10 + 1) * 10);

    return (round - sum == last) ? CheckImei.VALID_IMEI_NO_NETWORK : CheckImei.INVALID_IMEI;

}

答案 2 :(得分:0)

我认为这种逻辑不对,因为这只适用于特定的IMEI no - 490154203237518而不适用于其他IMEI没有...我也实现了代码......

var number = 490154203237518;
var array1 = new Array();
var array2 = new Array();
var specialno = 0 ;
var sum = 0 ;
var finalsum = 0;
var cast = number.toString(10).split('');
var finalnumber = '';
if(cast.length == 15){
    for(var i=0,n = cast.length; i<n; i++){

        if(i !== 14){
          if(i == 0 || i%2 == 0 ){
            array1[i] = cast[i];
          }else{
            array1[i] = cast[i]*2;
          }
        }else{
           specialno = cast[14];
        }

     }

     for(var j=0,m = array1.length; j<m; j++){
        finalnumber = finalnumber.concat(array1[j]);
     }

     while(finalnumber){
        finalsum += finalnumber % 10;
        finalnumber = Math.floor(finalnumber / 10);
     }

    contno = (finalsum/10);
    finalcontno = Math.round(contno)+1;

    check_specialno = (finalcontno*10) - finalsum; 

    if(check_specialno == specialno){
        alert('Imei')
    }else{
        alert('Not IMEI');
    }
}else{
    alert('NOT imei - length not matching');
}   


 //alert(sum);

答案 3 :(得分:0)

IMEI可以以0开头。这就是函数输入为字符串的原因。 感谢@KarlNicol方法

Golang

func IsValid(imei string) bool {
    digits := strings.Split(imei, "")

    numOfDigits := len(digits)

    if numOfDigits != 15 {
        return false
    }

    checkingDigit, err := strconv.ParseInt(digits[numOfDigits-1], 10, 8)
    if err != nil {
        return false
    }

    checkSum := int64(0)
    for i := 0; i < numOfDigits-1; i++ { // we dont need the last one
        convertedDigit := ""

        if (i+1)%2 == 0 {
            d, err := strconv.ParseInt(digits[i], 10, 8)
            if err != nil {
                return false
            }
            convertedDigit = strconv.FormatInt(2*d, 10)
        } else {
            convertedDigit = digits[i]
        }

        convertedDigits := strings.Split(convertedDigit, "")

        for _, c := range convertedDigits {
            d, err := strconv.ParseInt(c, 10, 8)
            if err != nil {
                return false
            }
            checkSum = checkSum + d
        }

    }

    if (checkSum+checkingDigit)%10 != 0 {
        return false
    }

    return true
}

答案 4 :(得分:-1)

我不相信有任何内置方法可以验证IMEI号码。您需要验证第三方数据库(谷歌搜索表明有许多此类服务,但可能他们也从更集中的来源获取信息)。