lunedì 23 dicembre 2013

C# e IMEI

Ero incuriosito da come gli imei funzionassero.
Prima di informarmi, ancora non sapevo che fossero necessariamente lunghi 15 cifre e che l'ultima servisse a verificare la validità delle prime 14.
Ho scritto un algoritmo per controllare la validità di un imei e/o generare la sua cifra di controllo.
Tra il codice trovate anche i come e i perché. Di solito non commento mai i programmi che scrivo, però era meglio fare un'eccezione questa volta ;-)

Ammetto che avevo fatto il ciclo di imeiCheckDigit in Linq, poi mi sono dato dell'idiota e l'ho riscritto come si deve. :D
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(checkImei(Console.ReadLine()));
            Console.ReadKey();
        }
        static bool checkImei(String imei)
        {
            int[] digits = getDigits(imei);
 
            //L'imei deve essere di 15 cifre
            if (digits.Length != 15)
                return false;
 
            return digits[14] == imeiCheckDigit(digits);
        }
        /*
         * si moltiplica * 2 da destra una cifra si una no. i numeri > 9 vengono divisi cifra per cifra
         * tutte le cifre vengono quindi sommate a formare un unico numero
         * esempio: 3 + 5*2 + 3 + 9*2 + 5 + 1*2 + 0 + 1*2 + 3 + 9*2 + 7 + 0*2 + 2 + 8*2 = _
         * 3+(1+0)+3+(1+8)+5+(2)+0+(2)+3+(1+8)+7+(0)+2+(1+6)=53
         * la cifra di controllo viene generata infine cercando il numero per rendere la somma divisibile per 10
         * esempio: se la somma è 53, la cifra di controllo è 7
         */
        static int imeiCheckDigit(int[] n)
        {
            int somma = 0;
 
            for (int i = n.Length-2; i > 0; i -= 2)
            {
                int a = n[i] * 2;
 
                if (a > 9)
                    a = a / 10 + a % 10;
 
                somma += a + n[i - 1];
            }
 
            somma %= 10;
 
            return somma == 0 ? 0 : (10 - somma);
        }
        static int[] getDigits(String s)
        {
            return s.Select(digit => int.Parse(digit.ToString())).ToArray();
        }
    }
}

Nessun commento:

Posta un commento