M4BASIC - b64enc.m4b
Not logged in
REM Demo implementing BASE64 encoder
REM http://en.wikipedia.org/wiki/Base64
REM
REM Taken from the base64 encoder example of BaCon.
REM PvE, August 2014 - GPL.

INTEGER byte1, byte2, byte3
INTEGER base1, base2, base3, base4
STRING dat, enc

IF argc != 2 THEN
    PRINT "Usage: b64enc <string>" NL
    END
ENDIF

REM Get the string to convert
LET dat = argv[1]

REM the Base64 constant
CONST BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

WHILE LEN(dat) > 0 DO

    REM Find ASCII values
    IF LEN(dat) == 1 THEN
        LET byte1 = ASC(MID(dat, 1, 1))
        LET byte2 = 0
        LET byte3 = 0
    ELIF LEN(dat) == 2 THEN
        LET byte1 = ASC(MID(dat, 1, 1))
        LET byte2 = ASC(MID(dat, 2, 1))
        LET byte3 = 0
    ELSE
        LET byte1 = ASC(MID(dat, 1, 1))
        LET byte2 = ASC(MID(dat, 2, 1))
        LET byte3 = ASC(MID(dat, 3, 1))
    ENDIF

    REM Create Base64 values
    LET base1 = byte1 / 4
    LET base2 = (byte1 & 3) * 16 + (byte2 & 240) / 16
    LET base3 = (byte2 & 15) * 4 + (byte3 & 192) / 64
    LET base4 = byte3 & 63

    REM Find Base64 characters
    IF LEN(dat) == 1 THEN
        SET enc = CONCAT(enc, MID(BASE64, base1 + 1, 1), MID(BASE64, base2 + 1, 1), "==")
        SET dat = ""
    ELIF LEN(dat) == 2 THEN
        SET enc = CONCAT(enc, MID(BASE64, base1 + 1, 1), MID(BASE64, base2 + 1, 1), MID(BASE64, base3 + 1, 1), "=")
        SET dat = ""
    ELSE
        SET enc = CONCAT(enc, MID(BASE64, base1 + 1, 1), MID(BASE64, base2 + 1, 1), MID(BASE64, base3 + 1, 1), MID(BASE64, base4 + 1, 1))
        SET dat = RIGHT(dat, LEN(dat) - 3)
    ENDIF
WEND

PRINT enc NL

Return to M4BASIC