See Base64 encode data.

Now write a program that takes the output of the Base64 encode data task as input and regenerate the original file.

When working on the VBA implementation I found several 'solutions' on the net, including one from the software maker himself, that showed output with incorrect padding. Obviously with incorrect padding in the output you can not decode correctly to the original file again.

Option _Explicit
 
Dim As String udata, decoded
udata = "VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"
 
decoded = decode(udata)
 
Print udata
Print decoded
 
Function findIndex& (value As _Unsigned _Byte)
    If Asc("A") <= value And value <= Asc("Z") Then
        findIndex = value - Asc("A")
        Exit Function
    End If
    If Asc("a") <= value And value <= Asc("z") Then
        findIndex = value - Asc("a") + 26
        Exit Function
    End If
    If Asc("0") <= value And value <= Asc("9") Then
        findIndex = value - Asc("0") + 52
        Exit Function
    End If
    If value = Asc("+") Then
        findIndex = 62
        Exit Function
    End If
    If value = Asc("/") Then
        findIndex = 63
        Exit Function
    End If
    findIndex = -1
End Function
 
Function encode$ (source As String)
    Dim As String Base64: Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim As _Unsigned _Integer64 length: length = Len(source)
    Dim As _Unsigned _Integer64 it, strend
    Dim As Long acc
    Dim As String sink
    strend = length
    While it <> strend
        Dim As _Unsigned _Byte b1, b2, b3, b4
        it = it + 1
        b1 = Asc(Mid$(source, it, 1))
        sink = sink + Mid$(Base64, _SHR(b1, 2), 1)
        acc = _SHL(b1 And &H3, 4)
        If it <> strend Then
            it = it + 1
            b2 = Asc(Mid$(source, it, 1))
            acc = acc Or _SHR(b2, 4)
            sink = sink + Mid$(Base64, acc, 1)
            acc = _SHL(b2 And &HF, 2)
            If it <> strend Then
                it = it + 1
                b3 = Asc(Mid$(source, it, 1))
                acc = acc Or _SHR(b3, 6)
                sink = sink + Mid$(Base64, acc, 1)
                sink = sink + Mid$(Base64, b3 And &H3F, 1)
            Else
                sink = sink + Mid$(Base64, acc, 1)
                sink = sink + "="
            End If
        Else
            sink = sink + Mid$(Base64, acc, 1)
            sink = sink + "="
            sink = sink + "="
        End If
    Wend
    encode = sink
End Function
 
Function decode$ (source As String)
    Dim As _Unsigned _Integer64 length: length = Len(source)
    Dim As _Unsigned _Integer64 it, strend
    Dim As Long acc
    Dim As String sink
    strend = length
    While it <> strend
        Dim As _Unsigned _Byte b1, b2, b3, b4
        it = it + 1
        b1 = Asc(Mid$(source, it, 1))
        it = it + 1
        b2 = Asc(Mid$(source, it, 1))
        it = it + 1
        b3 = Asc(Mid$(source, it, 1))
        it = it + 1
        b4 = Asc(Mid$(source, it, 1))
        Dim As Long i1, i2
        i1 = findIndex(b1)
        i2 = findIndex(b2)
        acc = _SHL(i1, 2)
        acc = acc Or _SHR(i2, 4)
        sink = sink + Chr$(acc)
        If b3 <> Asc("=") Then
            Dim As Long i3
            i3 = findIndex(b3)
            acc = _SHL(i2 And &HF, 4)
            acc = acc Or _SHR(i3, 2)
            sink = sink + Chr$(acc)
            If b4 <> Asc("=") Then
                Dim As Long i4
                i4 = findIndex(b4)
                acc = _SHL(i3 And &H3, 6)
                acc = acc Or i4
                sink = sink + Chr$(acc)
            End If
        End If
    Wend
    decode = sink
End Function