Newsgroup: it.comp.lang.visual-basic
Titolo: Piccolo(?) problema da principiante continua

Salve a tutti di nuovo.
Ho provato a mettere in pratica quello che mi avevate consigliato: ho
dichiarato tutte le variabili e ho usato una matrice di typo Byte al posto
della stringa: funziona, è molto più veloce! :-)))
Il problema adesso è un altro: come si fa a convertire nuovamente la Matrice
Byte in string? Lo so che è banale, ma nell'help di VB proprio non sono
riuscito a trovarlo e i vecchi messaggi (me l'avevate detto, mi sembra) sono
spariti sia dalla cache di Outlook che dal NG; non è che potreste
ripetermelo?
A proposito, ecco qua la routine: si tratta di un algoritmo di crittazione
con chiave, scritto a scopo autodidattico (Testo è la stringa originale)
Dim TestoStr() As Byte, ChiaveStr() As Byte
Dim Numero As Integer, I As Long
Dim NuovaStringa As String, Testo As String
TestoStr() = StrConv(Testo, vbFromUnicode)
ChiaveStr() = StrConv(Chiave, vbFromUnicode)
PosChiave = 0
For I = 0 To UBound(TestoStr)
    If PosChiave > UBound(ChiaveStr) Then PosChiave = 0
    Numero = CInt(TestoStr(I)) + CInt(ChiaveStr(PosPassword))
        'C'è un modo per non convertire in integer ?
    If Numero > 255 Then Numero = Numero - 256
    ReDim NuovaMatrice(I) As Byte
    NuovaMatrice(I) = CByte(Numero)
    PosChiave = PosChiave + 1
Next I
NuovaStringa = ??????
Grazie ancora.
Gabriele (
maut...@dada.it
)

...
Intanto suppongo che
Chiave As String
PosChiave As Long
PosPassWord As Long
tu le abbia dichiarate fuori dalla sub, anche se è una metodologia errata,
perchè altrimenti significa che non hai settato l'Option Explicit e quindi
ti consiglio di farlo subito!
Da quello che ho capito vorresti fare un algoritmo di cifratura (o
criptazione)
Questo è il codice che ho riscritto io secondo la mia interpretazione:
Dim TestoStr() As Byte, ChiaveStr() As Byte
Dim Numero As Integer, I As Long
Dim NuovaStringa As String, Testo As String, Chiave As String
Dim PosChiave As Long, PosPassWord As Long
Dim nuovamatrice() As Byte 'tu lo dimensionavi nel loop col risultato di
cancellare ogni volta la matrice.
Testo = "pippopluto"
Chiave = "pl"
TestoStr() = StrConv(Testo, vbFromUnicode)
ChiaveStr() = StrConv(Chiave, vbFromUnicode)
PosChiave = 0
For I = 0 To UBound(TestoStr)
    If PosChiave > UBound(ChiaveStr) Then PosChiave = 0
    'Numero = CInt(TestoStr(I)) + CInt(ChiaveStr(PosPassWord))
        'C'è un modo per non convertire in integer ?
        'Il CInt() qui ti serve solo per evitare l'overflow, giusto?
        'Allora ti serve solo sull'elemento più a destra
    Numero = CInt(TestoStr(I)) + ChiaveStr(PosPassWord)
    If Numero > 255 Then Numero = Numero - 256
    'Le due righe qui sopra le potevi scrivere come
    'Numero = (TestoStr(I) + ChiaveStr(PosPassWord) Mod 255)
    'così potevi usare Numero come byte ed evitare al compilatore di
convertire prima i due byte in integer,
    'poi l'if e poi la sottrazione. Il Mod credo sia un po' più lento della
sottazione, ma così hai un codice a velocità
    'costante in tutte le situazioni, e più breve
    ReDim Preserve nuovamatrice(I) As Byte 'Con il preserve "preservi" gli
elementi già settati
    nuovamatrice(I) = CByte(Numero) 'Con il metodo sopradescritto questo non
serve (non servirebbe lo stesso,
                                                       'ma nel tuo caso c'è
comunque un'altra conversione da fare...
    PosChiave = PosChiave + 1
Next I
'come ti avevo detto:
NuovaStringa = StrConv(nuovaMatrice, vbUnicode)