Проверьте действительный IMEI - PullRequest
5 голосов
/ 25 марта 2010

Кто-нибудь знает, как проверить действительный IMEI?

Я нашел функцию для проверки на этой странице: http://www.dotnetfunda.com/articles/article597-imeivalidator-in-vbnet-.aspx

Но он возвращает false для действительных IMEI (например, 352972024585360). Я могу подтвердить их онлайн на этой странице: http://www.numberingplans.com/?page=analysis&sub=imeinr

Как правильно (в VB.Net) проверить, является ли данный IMEI действительным?

PS: Эта функция на странице выше должна быть в некотором роде некорректной:

Public Shared Function isImeiValid(ByVal IMEI As String) As Boolean
    Dim cnt As Integer = 0
    Dim nw As String = String.Empty
    Try
        For Each c As Char In IMEI
            cnt += 1
            If cnt Mod 2 <> 0 Then
                nw += c
            Else
                Dim d As Integer = Integer.Parse(c) * 2 ' Every Second Digit has to be Doubled '
                nw += d.ToString() ' Genegrated a new number with doubled digits '
            End If
        Next
        Dim tot As Integer = 0
        For Each ch As Char In nw.Remove(nw.Length - 1, 1)
            tot += Integer.Parse(ch) ' Adding all digits together '
        Next
        Dim chDigit As Integer = 10 - (tot Mod 10) ' Finding the Check Digit my Finding the Remainder of the sum and subtracting it from 10 '
        If chDigit = Integer.Parse(IMEI(IMEI.Length - 1)) Then ' Checking the Check Digit with the last digit of the Given IMEI code '
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        Return False
    End Try
End Function

РЕДАКТИРОВАТЬ : Это моя рабочая "checkIMEI" -функция:

Public Shared Function checkIMEI(ByRef IMEI As String) As Boolean
    Const allowed As String = "0123456789"

    Dim cleanNumber As New System.Text.StringBuilder
    For i As Int32 = 0 To IMEI.Length - 1
        If (allowed.IndexOf(IMEI.Substring(i, 1)) >= 0) Then
            cleanNumber.Append(IMEI.Substring(i, 1))
        End If
    Next

    If cleanNumber.Length <> 15 Then
        Return False
    Else
        IMEI = cleanNumber.ToString
    End If

    For i As Int32 = cleanNumber.Length + 1 To 16
        cleanNumber.Insert(0, "0")
    Next

    Dim multiplier As Int32, digit As Int32, sum As Int32, total As Int32 = 0
    Dim number As String = cleanNumber.ToString()

    For i As Int32 = 1 To 16
        multiplier = 1 + (i Mod 2)
        digit = Int32.Parse(number.Substring(i - 1, 1))
        sum = digit * multiplier
        If (sum > 9) Then
            sum -= 9
        End If
        total += sum
    Next

    Return (total Mod 10 = 0)
End Function

Ответы [ 2 ]

10 голосов
/ 25 марта 2010

номера IMEI проверяются с использованием алгоритма Luhn . Связанная страница имеет реализации на разных языках. Этот пост также содержит несколько реализаций и общую методологию решения алгоритма Луна.

1 голос
/ 31 декабря 2018

IMEISV (версия программного обеспечения IMEI) не имеет контрольной цифры алгоритма Луна. Вместо этого номер версии программного обеспечения представлен двумя цифрами. Формат номера IMEI развивается годами.

Википедия является хорошим источником, я думаю, чтобы увидеть изменения в формате по годам. Если вы посмотрите новый формат версий IMEI и IMEISV, вы увидите, что Код окончательной сборки (FAC) удален, а код распределения типов (TAC) был увеличен до 8 цифр. Есть бесплатно и коммерческие списки TAC существуют в Интернете.

это может быть опция для проверки номера TAC путем поиска списков TAC поверх проверки алгоритма Luhn для новых и старых номеров IMEI. Для старых номеров IMEI FAC как 2 цифры следует отбросить, а проверку TAC следует выполнить для 6 цифр.

...