| Home Page | Recent Changes | Preferences

Base64

Wikipedia logo Base64 is a data encoding scheme whereby binary-encoded data is converted to printable ASCII characters. It is defined as a MIME content transfer encoding for use in internet e-mail. The only characters used are the upper- and lower-case Roman alphabet characters (A-Z, a-z), the numerals (0-9), and the "+" and "/" symbols, with the "=" symbol as a special suffix code.

Base64 is used in emails but also for basic HTTP authentication. However, base64 is not even close to anything secure. In other words, don't use it for securing information.

Code

/**
    base64 encode an input array
*/
static function array<string> Base64Encode(array<string> indata, out array<string> B64Lookup)
{
    local array<string> result;
    local int i, dl, n;
    local string res;
    local array<byte> inp;
    local array<string> outp;

    if (B64Lookup.length != 64) Base64EncodeLookupTable(B64Lookup);

    // convert string to byte array
    for (n = 0; n < indata.length; n++)
    {
        res = indata[n];
        outp.length = 0;
        inp.length = 0;
        for (i = 0; i < len(res); i++)
        {
            inp[inp.length] = Asc(Mid(res, i, 1));
        }

        dl = inp.length;
        // fix byte array
        if ((dl%3) == 1)
        {
            inp[inp.length] = 0;
            inp[inp.length] = 0;
        }
        if ((dl%3) == 2)
        {
            inp[inp.length] = 0;
        }
        i = 0;
        while (i < dl)
        {
            outp[outp.length] = B64Lookup[(inp[i] >> 2)];
            outp[outp.length] = B64Lookup[((inp[i]&3)<<4) | (inp[i+1]>>4)];
            outp[outp.length] = B64Lookup[((inp[i+1]&15)<<2) | (inp[i+2]>>6)];
            outp[outp.length] = B64Lookup[(inp[i+2]&63)];
            i += 3;
        }
        // pad result
        if ((dl%3) == 1)
        {
            outp[outp.length-1] = "=";
            outp[outp.length-2] = "=";
        }
        if ((dl%3) == 2)
        {
            outp[outp.length-1] = "=";
        }

        res = "";
        for (i = 0; i < outp.length; i++)
        {
            res = res$outp[i];
        }
        result[result.length] = res;
    }

    return result;
}

/**
    Decode a base64 encoded string
*/
static function array<string> Base64Decode(array<string> indata)
{
    local array<string> result;
    local int i, dl, n, padded;
    local string res;
    local array<byte> inp;
    local array<string> outp;

    // convert string to byte array
    for (n = 0; n < indata.length; n++)
    {
        res = indata[n];
        outp.length = 0;
        inp.length = 0;
        padded = 0;
        for (i = 0; i < len(res); i++)
        {
            dl = Asc(Mid(res, i, 1));
            // convert base64 ascii to base64 index
            if ((dl >= 65) && (dl <= 90)) dl -= 65; // cap alpha
            else if ((dl >= 97) && (dl <= 122)) dl -= 71; // low alpha
            else if ((dl >= 48) && (dl <= 57)) dl += 4; // digits
            else if (dl == 43) dl = 62;
            else if (dl == 47) dl = 63;
            else if (dl == 61) padded++;
            inp[inp.length] = dl;
        }

        dl = inp.length;
        i = 0;
        while (i < dl)
        {
            outp[outp.length] = Chr((inp[i] << 2) | (inp[i+1] >> 4));
            outp[outp.length] = Chr(((inp[i+1]&15)<<4) | (inp[i+2]>>2));
            outp[outp.length] = Chr(((inp[i+2]&3)<<6) | (inp[i+3]));
            i += 4;
        }
        outp.length = outp.length-padded;

        res = "";
        for (i = 0; i < outp.length; i++)
        {
            res = res$outp[i];
        }
        result[result.length] = res;
    }

    return result;
}

/**
    Generate the base 64 encode lookup table
*/
static function Base64EncodeLookupTable(out array<string> LookupTable)
{
    local int i;
    for (i = 0; i < 26; i++)
    {
        LookupTable[i] = Chr(i+65);
    }
    for (i = 0; i < 26; i++)
    {
        LookupTable[i+26] = Chr(i+97);
    }
    for (i = 0; i < 10; i++)
    {
        LookupTable[i+52] = Chr(i+48);
    }
    LookupTable[62] = "+";
    LookupTable[63] = "/";
}

License

This code is part of the LibHTTP package which is released under the LesserOpenUnrealModLicense

Copyright 2003/2004 Michiel "El Muerte" Hendriks

Related Articles

  • [RFC 1341] — the MIME rfc explains the base64 encoding algorithm

Category Algorithm

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Image Uploads

Random Page

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In