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!
