Domanda

Qualcuno sa come controllare per un IMEI valido?

Ho trovato una funzione per controllare in questa pagina: http : //www.dotnetfunda.com/articles/article597-imeivalidator-in-vbnet-.aspx

Ma ritorna false per (352972024585360 f.e.) valida di IMEI. Posso convalidare online su questa pagina: http://www.numberingplans.com/?page = analisi e sub = imeinr

Qual è il modo corretto (in VB.Net) per verificare se un dato IMEI è valida?

PS: Questa funzione dall'alto pagina deve essere corretto in qualche modo:

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

Modifica : Questo è il mio lavoro -Funzione "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
È stato utile?

Soluzione

numeri IMEI vengono convalidati utilizzando il Luhn algoritmo. La pagina collegata ha implementazioni in varie lingue. Questo post ha anche un altro paio di implementazioni e una metodologia generale su come fare per risolvere l'algoritmo Luhn.

Altri suggerimenti

IMEISV (IMEI versione del software) non ha Luhn algoritmo di controllo cifre. Invece ha Versione software Numero presentato con due cifre. Formato del numero IMEI si è evoluto da anni.

Wikipedia è la buona fonte Credo che per vedere i cambiamenti nel formato da anni. Se si guarda il nuovo formato di versione IMEI e IMEISV, si vedrebbe che Final Assembly Code (FAC) ha rimosso e tipo codice di allocazione (TAC) è stato aumentato l'8 cifre. Ci sono gratuito e liste TAC commerciali presenti su internet.

potrebbe essere un'opzione per convalidare il numero TAC, cercando gli elenchi TAC in cima Luhn convalida algoritmo per vecchi e nuovi numeri IMEI. Per i vecchi numeri IMEI FAC come 2 cifre deve essere eliminata e la validazione TAC dovrebbe essere fatto per 6 cifre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top