Private Const EOL_SIZE As Long = 2 ' Size of vbCrLf
Private Const LINE_SIZE As Long = 40 + EOL_SIZE ' Size of a line
Private Const Base64 As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Private Const Base64_EOF As String = "="
Public Function Decode64(ByRef lpConvString As String) As String
Dim pt As Long
Dim ptMax As Long
Dim dwBuffer As Long
Dim cbSize As Long
Dim cbBits As Byte
Dim aByte As Byte
dwBuffer = 0
cbBits = 0
cbSize = 0
pt = 1
ptMax = Len(lpConvString)
Do While pt <= ptMax
aByte = InStr(1, Base64, Mid$(lpConvString, pt, 1))
If aByte Then
' Add 6 bits to the buffer
dwBuffer = dwBuffer * 64 + aByte - 1
cbBits = cbBits + 6
If cbBits >= 8 Then
Select Case cbBits
Case 12 ' 6 + 6
aByte = dwBuffer \ 16
dwBuffer = dwBuffer And 15
cbBits = 4
Case 10 ' 4 + 6
aByte = dwBuffer \ 4
dwBuffer = dwBuffer And 3
cbBits = 2
Case 8 ' 2 + 6
aByte = dwBuffer
dwBuffer = 0
cbBits = 0
End Select
cbSize = cbSize + 1
Mid$(lpConvString, cbSize, 1) = Chr$(aByte)
End If
End If
pt = pt + 1
Loop
Decode64 = Mid$(lpConvString, 1, cbSize)
End Function
Public Function Encode64(ByRef lpConvString As String) As String
Dim pt As Long
Dim ptMax As Long
Dim dwBuffer As Long
Dim cbSize As Long
Dim cbBits As Byte
Dim cbLines As Long
Dim aByte As Byte
Dim lpBuffer As String
dwBuffer = 0
cbBits = 0
cbSize = EOL_SIZE ' Tips for the NewLine
cbLines = 1
pt = 1
ptMax = Len(lpConvString)
lpBuffer = String$(LINE_SIZE + ptMax * 2, 0)
Do Until pt > ptMax
' Add 8 bits to the buffer
dwBuffer = dwBuffer * 256 + Asc(Mid$(lpConvString, pt, 1))
cbBits = cbBits + 8
Do
Select Case cbBits
Case 6
aByte = dwBuffer
dwBuffer = 0
cbBits = 0
Case 8
aByte = dwBuffer \ 4
dwBuffer = dwBuffer And 3
cbBits = 2
Case 10
aByte = dwBuffer \ 16
dwBuffer = dwBuffer And 15
cbBits = 4
Case 12
aByte = dwBuffer \ 64
dwBuffer = dwBuffer And &H3F
cbBits = 6
Case 2 ' Only when pt = ptmax
aByte = dwBuffer * 16
dwBuffer = 0
cbBits = 0
Case 4 ' Only when pt = ptmax
aByte = dwBuffer * 4
dwBuffer = 0
cbBits = 0
End Select
' Add a character to the buffer
cbSize = cbSize + 1
Mid$(lpBuffer, cbSize, 1) = Mid$(Base64, 1 + aByte, 1)
' Add the NewLine to the buffer
If (cbSize Mod LINE_SIZE) = 0 Then
Mid$(lpBuffer, cbSize + 1, EOL_SIZE) = vbCrLf
cbSize = cbSize + EOL_SIZE
cbLines = cbLines + 1
End If
' Loop while not done with this byte
Loop While (cbBits = 6) Or ((pt = ptMax) And (cbBits > 0))
pt = pt + 1
Loop
' Add one or two bytes Base64_EOF
Select Case (cbSize - EOL_SIZE * cbLines) Mod 3
Case 1: '8 bit final
Mid$(lpBuffer, cbSize + 1, 2) = Base64_EOF & Base64_EOF
cbSize = cbSize + 2
Case 2: '16 bit final
Mid$(lpBuffer, cbSize + 1, 1) = Base64_EOF
cbSize = cbSize + 1
End Select
' Return the string and ignore the two first bytes
Encode64 = Mid$(lpBuffer, 1 + EOL_SIZE, cbSize - EOL_SIZE)
End Function
Public Function hash_string(ByRef s As String) As String
Dim h As Long
Dim i As Long
h = 0
For i = 1 To Len(s)
h = ((h And &HFF000000) \ &H1000000) + _
(((h And &HFFFFFF) * 8) + Asc(Mid$(s, i, 1)))
Next
hash_string = Right$("00000000" & Hex$(h), 8)
End Function