112 lines
3.2 KiB
Plaintext
112 lines
3.2 KiB
Plaintext
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
|