Public Sub Base64Dec02(Base64String As String, abDst() As Byte)
' by G.Beckmann, G.Beckmann@NikoCity.de, 20011204 [20001224]
Static aB(255) As Byte
Dim saSrc As bstrapi.SAFEARRAY1D, aSrc%()
Dim b1%, b2%, b3%
Dim p&, c&, n&, iL&, i&, j&
If aB(0) = 0 Then
RtlFillMemory aB(0), 256, 64
For c = 48 To 57: aB(c) = c + 4: Next c
For c = 65 To 90: aB(c) = c - 65: Next c
For c = 97 To 122: aB(c) = c - 71: Next c
aB(43) = 62: aB(47) = 63: c = 0
End If
iL = Len(Base64String)
If iL = 0 Then Erase abDst: Exit Sub
p = ArrPtr(aSrc)
With saSrc
.cDims = 1
.cbElements = 2
.pvData = StrPtr(Base64String)
.cElements1D = iL
End With
RtlMoveMemory ByVal p, VarPtr(saSrc), 4
Select Case 61
Case aSrc(iL - 2): j = 3: c = 1
Case aSrc(iL - 1): j = 2: c = 1
Case Else: j = 1
End Select
i = iL \ 4
ReDim Preserve abDst(0 To i * 3 - j)
i = i - c
c = 0
Do While i
b1 = aB(aSrc(c + 1))
b2 = aB(aSrc(c + 2))
b3 = aB(aSrc(c + 3))
abDst(n) = (aB(aSrc(c)) * 4) Or (b1 \ 16)
abDst(n + 1) = (b1 And &HF) * 16 Or (b2 \ 4)
abDst(n + 2) = (b2 And &H3) * 64 Or b3
n = n + 3
c = c + 4
i = i - 1
Loop
Select Case j
Case 3
abDst(n) = (aB(aSrc(c)) * 4) Or (aB(aSrc(c + 1)) \ 16)
Case 2
b1 = aB(aSrc(c + 1))
abDst(n) = (aB(aSrc(c)) * 4) Or (b1 \ 16)
abDst(n + 1) = (b1 And &HF) * 16 Or (aB(aSrc(c + 2)) \ 4)
End Select
RtlZeroMemory ByVal p, 4
End Sub
|