Newsgroup: it.comp.lang.visual-basic
Titolo: Base64 encoder

Ciao a tutti!
Qualcuno saprebbe suggerirmi un link per una libreria o una classe
disponibile on-line, freeware, che consenta la codifica a 64bit MIME?
Possibilmente che funzioni! (io ho trovato una base64.dll e base64.cls
che non riesco a far funzionare...)
Ciao e grazie a tutti!
Davide
-- 
Volontario Anti-Troll (TM) 
SecurFaq: 
http://members.nbci.com/gouldukat/
DocTrolls: 
http://it.geocities.com/roccopapaleo/faq/italiano/Troll.html
Netiquette: 
http://www.inferentia.it/netiquette/dis.html

 Davide
------------------------------------cut-------------------------------------
---
Sub Base64Encode(filei As String, fileo As String)
    On Error Resume Next
    Dim l As Long, i As Long, Filein As Long, Fileout As Long
    Dim temp As Variant
    Dim b As Integer
    Dim Base64Tab As Variant
    Dim bin(3) As Byte
    Dim s As Variant
    Base64Tab = Array("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",
"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", "0", "1", "2", "3",
"4", "5", "6", "7", "8", "9", "+", "/")
'file di input
    Filein = FreeFile
    Open filei For Binary As Filein
    l = LOF(Filein) - (LOF(Filein) Mod 3)
'file di output
    Fileout = FreeFile
    Open fileo For Output As Fileout
'legge blocchi di 3 byte e scrive
    For i = 1 To l Step 3
    'legge tre byte
        Get Filein, , bin(0)
        Get Filein, , bin(1)
        Get Filein, , bin(2)
    'scriva la stringa
        If Len(s) > 64 Then
            Print #Fileout, s
            s = ""
        End If
    'calcola il codice base 64
        b = (bin(0) \ 4) And &H3F 'right shift 2 bits (&H3F=111111b)
    'the character s holds the encoded chars
        s = s + Base64Tab(b)
        b = ((bin(0) And &H3) * 16) Or ((bin(1) \ 16) And &HF)
        s = s + Base64Tab(b)
        b = ((bin(1) And &HF) * 4) Or ((bin(2) \ 64) And &H3)
        s = s + Base64Tab(b)
        b = bin(2) And &H3F
        s = s + Base64Tab(b)
    Next i
'finisce di leggere il resto del file
    If Not (LOF(Filein) Mod 3 = 0) Then
    'legge i byte rimanenti
        For i = 1 To (LOF(Filein) Mod 3)
            Get Filein, , bin(i - 1)
        Next i
    'se ci sono 2 byte...
        If (LOF(Filein) Mod 3) = 2 Then
            b = (bin(0) \ 4) And &H3F 'right shift 2 bits (&H3F=111111b)
            s = s + Base64Tab(b)
            b = ((bin(0) And &H3) * 16) Or ((bin(1) \ 16) And &HF)
            s = s + Base64Tab(b)
            b = ((bin(1) And &HF) * 4) Or ((bin(2) \ 64) And &H3)
            s = s + Base64Tab(b)
            s = s + "="
    'se c'e' un solo byte...
        Else
            b = (bin(0) \ 4) And &H3F 'right shift 2 bits (&H3F=111111b)
            s = s + Base64Tab(b)
            b = ((bin(1) And &H3) * 16) Or ((bin(1) \ 16) And &HF)
            s = s + Base64Tab(b)
            s = s + "=="
        End If
    End If
'salva gli ultimi dati
    If s <> "" Then
        Print #Fileout, s
    End If
'uscita
    Close Filein
    Close Fileout
End Sub
------------------------------------cut-------------------------------------
---

 Davide
ti serve anche il DEcoder?
CIAO!

End Sub
<cut>
Grande!!! Funzica, vero? 
Mo lo provo, se va ti pago una birra virtuale!
ciao!


CIAO!
se per te non è un problema... cosi' implemento anche la ricezione...
Grazie infinite!
Ciao!


 Davide
confermami la ricezione. ciao!
----------------------------------cut---------------------------------
Sub Base64Decode(filei As String, fileo As String)
    On Error Resume Next
    Dim Tabella(300) As Byte
    Dim out1 As String * 1
    Dim out2 As String * 1
    Dim out3 As String * 1
    Dim a As Byte
    Dim b As Byte
    Dim c As Byte
    Dim d As Byte
    Dim riga As String
    Dim blocco As String
'crea la tabella di conversione
    riga =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    For n = 0 To Len(riga$) - 1
        indice = Asc(Mid$(riga, n + 1, 1))
        Tabella(indice) = n
    Next n
    Tabella(Asc("=")) = 100
'legge il file e lo converte
    blocco = ""
    f1 = FreeFile
    Open filei For Input As f1
    f2 = FreeFile
    Open fileo For Binary As f2
    While Not EOF(f1)
        Line Input #f1, riga
        For n = 1 To Len(riga$) Step 4
            a = Tabella(Asc(Mid$(riga$, n + 0, 1)))
            b = Tabella(Asc(Mid$(riga$, n + 1, 1)))
            c = Tabella(Asc(Mid$(riga$, n + 2, 1)))
            d = Tabella(Asc(Mid$(riga$, n + 3, 1)))
            If c = 100 And d = 100 Then
                out1 = Chr$(((a And 63) * 4) + (b \ 16))
                blocco = blocco + out1
            Else
                If d = 100 Then
                    out1 = Chr$(((a And 63) * 4) + (b \ 16))
                    out2 = Chr$(((b And 15) * 16) + (c \ 4))
                    blocco = blocco + out1 + out2
                Else
                    out1 = Chr$(((a And 63) * 4) + (b \ 16))
                    out2 = Chr$(((b And 15) * 16) + (c \ 4))
                    out3 = Chr$(((c And 3) * 64) + d)
                    blocco = blocco + out1 + out2 + out3
                End If
            End If
        Next n
        Put f2, , blocco
        blocco = ""
    Wend
'fine
    Close f1
    Close f2
End Sub
----------------------------------cut---------------------------------