Lezioni di programmazione - 1a puntata - Nomen Omen

pubblicato il 19/11/2008 aggiornato il 27/01/2009

Recentemente ci siamo imbattutti nell'importazione di alcuni file in cui i numeri di serie non venivano scritti in formato "decimale normale" (che so? "2376541") ma in un formato strampalato che, documentazione (battutona!) alla mano, abbiamo faticato non poco a decifrare (nell'esempio delle parentesi precedenti: "0123;4567;").

Il collega incaricato della routine di importazione si è messo di buzzo buono, ha capito la strana logica e - correttamente - prima di partire lancia in resta con la scrittura del codice, mi ha chiesto se doveva prendere qualche precauzione particolare: "Uhm.... solo questo: dài un nome significativo al metodo e commentalo adeguatamente, così se lo riprendiamo in mano tra qualche mese non diventiamo matti". Detto fatto, questo è ciò che mi sono ritrovato alla successiva Get Latest Version:

  Protected Function SnafucateBytes(ByVal serialVersion As String) As String

    'NOTA di XY:
    'Caro lettore, se ti stai chiedendo con cosa mi sono drogato per tirar fuori 'sto pezzo di codice la
    'risposta è: purtroppo niente...
    'Tutto nasce dal fatto che a CittàItaliana nessuna delle tessere validate dai gate SocietàNonItaliana risultava venduta
    'da NostroApparatoDiVendita.
    'Nei log di validazione SocietàNonItaliana il seriale della tessera validata è rappresentato come due stringhe
    'di 8 caratteri l'una (4 byte, caratteri esadecimali), separate da ;
    '  0 1 2 3; 4 5 6 7;
    'il primo byte è sempre un 88 (ps: terribile coincidenza...) e va scartato perchè si usano MyFare
    'Ultralight con seriali a 7 byte o Myfare 1K con seriale a 4 byte.
    'Per ottenere un seriale valido, effettivamente venduto da NostroApparatoDiVendita, gli altri byte li devo mischiare
    'nel modo seguente:
    '  2 3 7 6 5 4 1
    'Se i byte 2 e 3 sono 00 00 posso, con buona sicurezza, trovarmi di fronte ad una Myfare 1K, nel qual
    'caso mi basta scartare i primi 4 byte, invertire gli altri e ottengo un seriale valido.
    '  7 6 5 4

    Dim snafucatedSerialNumber As String
    Dim bytes(CInt(serialVersion.Length / 2)) As String

    For i As Integer = 0 To CInt((serialVersion.Length) / 2) - 1
      bytes(i) = serialVersion.Substring(i * 2, 2)
    Next

    If bytes(2) = "00" AndAlso bytes(3) = "00" Then
      snafucatedSerialNumber = bytes(7) + bytes(6) + bytes(5) + bytes(4)
    Else
      snafucatedSerialNumber = bytes(2) + bytes(3) + bytes(7) + bytes(6) + bytes(5) + bytes(4) + bytes(1)
    End If

    Return snafucatedSerialNumber

  End Function

Bravo ragazzo, così si fa!