Encoding Text into Base64

Encoding Text into Base64

It can be useful to encode a text string into a base 64 representation. For example when passing usernames and passwords to an SMTP server the request and response are both done using base 64.
The encoding is done by taking 3 ASCII values to form a 24bit binary value end then splitting this into 6 bit chunks starting from the left hand side. If there are less then 3 characters at the end then we pad out with zeroes and add one or 2 == signs to the end of the Base64 string

        REM Base 64 Endode and Decode
        INPUT "Enter String to be encoded:" input$
        A$ = FNEncode64(input$)
        PRINT A$
        B$=FNDecode64(A$)
        PRINT B$
        END

The program uses the following Function to encode the input string and return the Base64 Encoded Text

        REM Function to Encode a string into Base64
        DEF FNEncode64(text$)
        enc$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        REM Get length of input string
        len=LEN(text$)
        output$=""
        count1 = 1
        WHILE (count1 <= len)
          in%=0 REM This will hold up to 3 input characters as an integer
          count2=0
          REM Get next 3 characters - or however many remains in the string as appropriate
          REPEAT
            in%=in% << 8 REM Shift bits 8 places to the left (same as multiplying by 256)
            in%=in%+ASC(MID$(text$,(count1+count2),1)) REM Add ASCII Value of Character
            count2 += 1
          UNTIL(count2=3 OR ((count1+count2)>len))
          in%=in%<<(8*(3-count2)) REM Pad with zeroes if we have less than 3 bytes to make a 24 bit number
          FOR n=1 TO 4
            output$+= MID$(enc$, (in%>>18)+1,1)
            in% = (in% << 6) AND  &FFFFFF REM move next 6 binary digits into position
          NEXT n
          IF (count2=1) THEN RIGHT$(output$,2)="==" ELSEIF (count2=2) THEN RIGHT$(output$)="="
          count1 += 3
        ENDWHILE
        =output$



And also this function to Decode a Base64 string back to a standard ASCII String

        REM Function to decode a Base64 string into ASCII
        DEF FNDecode64(B64$)
        enc$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        output$=""
        padding=0
        len=LEN B64$
        REM because of the padding character = at the end of the encoded text, the base 64 string length will always be a multiple of 4
        FOR pos=1 TO len STEP 4
          in%=0
          REM Get the next 4 Characters and convert to a 24 bit number
          FOR pos2=0 TO 3
            out%=0
            in%=in%<<6
            IF MID$(B64$,pos+pos2,1)="=" THEN
              padding=padding+1
            ELSE
              out%=INSTR(enc$, MID$(B64$,pos+pos2,1))-1
              in%=in%+out%
            ENDIF
          NEXT
          REM Now we have a 24 bit value we break it down into up to 3 8 bit chunks
          FOR n = 1 TO (3-padding)
            out%=in% >>16
            output$=output$+CHR$(out%)
            in%=(in%<<8) AND &FFFFFF REM Shift next 8 bits into position
          NEXT
        NEXT
 
        =output$