Cogito, ergo sum

Legacy:Base64

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

Wikipedia: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[edit]

/**
	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[edit]

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

Copyright 2003/2004 Michiel "El Muerte" Hendriks

Related Articles[edit]

  • RFC 1341 → the MIME rfc explains the base64 encoding algorithm