public Sub ISO_6346_Ck(CtrNum As String) As Boolean
Dim acc, ax, checkdigit As Int
Dim remx, s, i As Int
Dim b As Boolean
Dim Indice() As String= Array As String("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")
Dim Value() As Int = Array As Int (10,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38)
Dim M As Map
M.Initialize
' Carica il vettore dei valori alfanumerici -> Star-Dust mode :)
For i= 0 To Indice.Length - 1
M.Put(Indice(i),Value(i))
Next
acc = 0
s = 0
' Esegue l'algoritmo per il check dei primi 10 valori
For i = 0 To 9
' L'algoritmo prevede la moltiplicazione con 2^n e per n da 0 a 9
s = Power(2, i)
' Le prime quattro sono lettere
If i < 4 Then
ax = M.Get(Indice(Asc(CtrNum.CharAt(i))-65)) * s
Else
' I restanti 6 sono numeri
ax = (Asc(CtrNum.CharAt(i)) - 48) * s
End If
acc = acc + ax
Next
remx = (Floor(acc) Mod 11) Mod 10
' Estrazione check digit e conversione in numero
checkdigit = Asc(CtrNum.CharAt(10))-48
' Controllo tra calcolato e inserito (ultima cifra)
If (CtrNum.Length = 11) And (remx = checkdigit) Then
b = True
End If
Return (b)
End Sub