Monthly Archives: June 2011

Base64 URL Decode Function using VBScript

A co-worker and I just spent some frustrating time trying to figure out how to write a base64 URL decoder in vbscript (for a facebook app).  We thought someone else might have the same issues – so here you go.  You need both functions to make it work:

decodedString= Base64URLDecode(encodedString)

Function Base64URLDecode(stringtodecode)

   stringtodecode = replace(stringtodecode,"-", "+")
   stringtodecode = replace(stringtodecode,"_", "/")

   select case (len(stringtodecode) mod 4)
      case 0: stringtodecode = stringtodecode
      case 2: stringtodecode = stringtodecode +"=="
      case 3: stringtodecode = stringtodecode +"="
      case else:    Err.Raise 1, "Base64Decode", "Bad Base64 string."
   end select
   stringtodecode=Base64Decode(stringtodecode)
   Base64URLDecode = stringtodecode
End function

Function Base64Decode(base64String)
  'rfc1521
  ' Decodes a base-64 encoded string (BSTR type).
  ' 1999 - 2004 Antonin Foller, http://www.motobit.com
  ' 1.01 - solves problem with Access And 'Compare Database' (InStr)
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim dataLength, sOut, groupBegin

  'remove white spaces, If any
  base64String = Replace(base64String, vbCrLf, "")
  base64String = Replace(base64String, vbTab, "")
  base64String = Replace(base64String, " ", "")

  'The source must consists from groups with Len of 4 chars
  dataLength = Len(base64String)
  If dataLength Mod 4 <> 0 Then
    Err.Raise 1, "Base64Decode", "Bad Base64 string."
    Exit Function
  End If

  ' Now decode each group:
  For groupBegin = 1 To dataLength Step 4
    Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
    ' Each data group encodes up To 3 actual bytes.
    numDataBytes = 3
    nGroup = 0

    For CharCounter = 0 To 3
      ' Convert each character into 6 bits of data, And add it To
      ' an integer For temporary storage.  If a character is a '=', there
      ' is one fewer data byte.  (There can only be a maximum of 2 '=' In
      ' the whole string.)

      thisChar = Mid(base64String, groupBegin + CharCounter, 1)

      If thisChar = "=" Then
        numDataBytes = numDataBytes - 1
        thisData = 0
      Else
        thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
      End If
      If thisData = -1 Then
        Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
        Exit Function
      End If

      nGroup = 64 * nGroup + thisData
    Next

    'Hex splits the long To 6 groups with 4 bits
    nGroup = Hex(nGroup)

    'Add leading zeros
    nGroup = String(6 - Len(nGroup), "0") & nGroup

    'Convert the 3 byte hex integer (6 chars) To 3 characters
    pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 5, 2)))

    'add numDataBytes characters To out string
    sOut = sOut & Left(pOut, numDataBytes)
  Next

  Base64Decode = sOut
End Function