VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



base64 decoder

by Tair Abdurman (6 Submissions)
Category: String Manipulation
Compatability: Visual Basic 3.0
Difficulty: Intermediate
Date Added: Wed 3rd February 2021
Rating: (3 Votes)

Decode base64 encoded Input file into Output file.

Rate base64 decoder

'(C) 2000 by Tair Abdurman
'WWW: www.tair.freeservers.com
'e-mail: [email protected]
'this version to decode Outlook encrypted
'attachments
'Base64 decode routines
' based on RFC 1421
'----------------------------------------------------------------------------------------------------
' Quantum of decoded content
'----------------------------------------------------------------------------------------------------
'    3       2       1       0
' 00XXXXXX 00XXXXXX 00XXXXXX 00XXXXXX
'   |    |   | | |  |   |  | | |  |    |
'    A1    A2 B1    B2  C1    C2
'----------------------------------------------------------------------------------------------------
' Bit positions:
'----------------------------------------------------------------------------------------------------
'      AND     SHIFT RIGHT   SHIFT LEFT     BYTE NUMB
'  A1  3FH         01H         08H          3
'  A2  30H         10H         01H          2
'
'  B1   0FH         01H        10H          2
'  B2   3CH         08H        01H          1
'
'  C1   03H         01H        40H          1
'  C2   3FH         01H        01H          0
'----------------------------------------------------------------------------------------------------
' Decoded Triple
'   DA      DB     DC
' XXXXXXXX XXXXXXXX XXXXXXXX
'----------------------------------------------------------------------------------------------------
'  VB Formula:
'  Ydecoded(DZ)=(Xencoded(Z1bytenum) AND Z1and)*Z1shiftright +
'          (Xencoded(Z2bytenum) AND Z2and)/Z2shiftleft
'----------------------------------------------------------------------------------------------------
Option Explicit
Private Type b64encoded
   Byte1 As Byte
   Byte2 As Byte
   Byte3 As Byte
   Byte4 As Byte
End Type
Private Type b64decoded
   Byte1 As Byte
   Byte2 As Byte
   Byte3 As Byte
End Type
Private Type codecodeBytes
   Byte1 As Byte
   Byte2 As Byte
   Byte3 As Byte
   Byte4 As Byte
End Type
Dim keyByteA As codecodeBytes
Dim keyByteB As codecodeBytes
Dim keyByteC As codecodeBytes
Private Sub InitDecodeEncodeMachine()
 
'-------------------------------
keyByteA.Byte1 = &H3F
keyByteA.Byte2 = &H4
keyByteA.Byte3 = &H30
keyByteA.Byte4 = &H10
'-------------------------------
'-------------------------------
keyByteB.Byte1 = &HF
keyByteB.Byte2 = &H10
keyByteB.Byte3 = &H3C
keyByteB.Byte4 = &H4
'-------------------------------
'-------------------------------
keyByteC.Byte1 = &H3
keyByteC.Byte2 = &H40
keyByteC.Byte3 = &H3F
keyByteC.Byte4 = &H1
'-------------------------------
End Sub
'Decode source file encoded by base64 into destination
Public Sub DecodeFile(ByVal srcFile As String, ByVal dstFile As String)
  Dim tempBuffer As String * 78
  Dim tempBufferNC As String * 74
  Dim tempEncoded As b64encoded
  Dim tempDecoded As b64decoded
  Dim bResult As Byte
  Dim iCntr As Long
  Dim btResult As Byte
  
  
  Call InitDecodeEncodeMachine
btResult = 0
iCntr = 0
  
 
  Open srcFile For Random As #1 Len = 78
  Open dstFile For Random As #2 Len = 1
   
   Do While Not (EOF(1))
    Get #1, , tempBuffer
    
    iCntr = 0
    Do While iCntr < Len(tempBuffer)
      
      If Mid(tempBuffer, (iCntr + 1), 2) = vbCrLf Then Exit Do
      
      tempEncoded.Byte1 = DeMapCode(Mid(tempBuffer, (iCntr + 1), 1))
      tempEncoded.Byte2 = DeMapCode(Mid(tempBuffer, (iCntr + 2), 1))
      tempEncoded.Byte3 = DeMapCode(Mid(tempBuffer, (iCntr + 3), 1))
      tempEncoded.Byte4 = DeMapCode(Mid(tempBuffer, (iCntr + 4), 1))
    
      
      bResult = 0
      bResult = Base64Decode(tempEncoded, tempDecoded)
      
      Select Case bResult
      
      Case 1
        Put #2, , tempDecoded.Byte1
      Case 2
        Put #2, , tempDecoded.Byte1
        Put #2, , tempDecoded.Byte2
      Case 3
        Put #2, , tempDecoded.Byte1
        Put #2, , tempDecoded.Byte2
        Put #2, , tempDecoded.Byte3
      End Select
  
     
      'EOF encoded part
      If (bResult = 0) Then Exit Do
     
      'FOUR bytes as step
      iCntr = iCntr + 4
    
    Loop
    'if end of encoded text
    If (bResult = 0) Then Exit Do
   Loop
   
  Close #2
  Close #1
End Sub

Private Function Base64Decode(srcBase64Encoded As b64encoded, dstBase64Decoded As b64decoded) As Byte
'return amoun of decoded bytes
If (srcBase64Encoded.Byte1 > 64) Then
 Base64Decode = 0
 Exit Function
End If
If ((srcBase64Encoded.Byte3 = 64) And (srcBase64Encoded.Byte4 = 64)) Then
 dstBase64Decoded.Byte1 = (srcBase64Encoded.Byte1 And keyByteA.Byte1) * keyByteA.Byte2 + _
                     (srcBase64Encoded.Byte2 And keyByteA.Byte3) / keyByteA.Byte4
 dstBase64Decoded.Byte2 = 0
 dstBase64Decoded.Byte3 = 0
 Base64Decode = 1
 Exit Function
End If
If (srcBase64Encoded.Byte4 = 64) Then
 dstBase64Decoded.Byte1 = (srcBase64Encoded.Byte1 And keyByteA.Byte1) * keyByteA.Byte2 + _
                    (srcBase64Encoded.Byte2 And keyByteA.Byte3) / keyByteA.Byte4
 dstBase64Decoded.Byte2 = (srcBase64Encoded.Byte2 And keyByteB.Byte1) * keyByteB.Byte2 + _
                    (srcBase64Encoded.Byte3 And keyByteB.Byte3) / keyByteB.Byte4
 dstBase64Decoded.Byte3 = 0
 Base64Decode = 2
 Exit Function
End If
dstBase64Decoded.Byte1 = (srcBase64Encoded.Byte1 And keyByteA.Byte1) * keyByteA.Byte2 + _
                    (srcBase64Encoded.Byte2 And keyByteA.Byte3) / keyByteA.Byte4
dstBase64Decoded.Byte2 = (srcBase64Encoded.Byte2 And keyByteB.Byte1) * keyByteB.Byte2 + _
                    (srcBase64Encoded.Byte3 And keyByteB.Byte3) / keyByteB.Byte4
dstBase64Decoded.Byte3 = (srcBase64Encoded.Byte3 And keyByteC.Byte1) * keyByteC.Byte2 + _
                    (srcBase64Encoded.Byte4 And keyByteC.Byte3) / keyByteC.Byte4
Base64Decode = 3
     
End Function
Private Function DeMapCode(srcChar As String) As Byte
  If Len(srcChar) <> 1 Then
    DeMapCode = 0
    Exit Function
  End If
  
  Select Case srcChar
    Case "A" To "Z"
        DeMapCode = Asc(srcChar) - 65
    Case "a" To "z"
        DeMapCode = Asc(srcChar) - 97 + 26
    Case "0" To "9"
        DeMapCode = Asc(srcChar) - 48 + 52
    Case "+"
        DeMapCode = 62
    Case "/"
        DeMapCode = 63
    Case "="
        DeMapCode = 64
    Case Else
        DeMapCode = 65
  End Select
End Function

Download this snippet    Add to My Saved Code

base64 decoder Comments

No comments have been posted about base64 decoder. Why not be the first to post a comment about base64 decoder.

Post your comment

Subject:
Message:
0/1000 characters