RosettaCodeData/Task/Base64-decode-data/QB64/base64-decode-data.qb64

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