Base64 Encoding

Encodes data with MIME base64. This encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean, such as mail bodies.



									char SixBitToChar(char b)
{
	char lookupTable[] = {
		'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
		'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
		'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
		'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
	};

	if ((b >= 0) && (b <= 63))
	{
		return lookupTable[(int)b];
	}
	else
	{
		return ' ';
	}
}

char* Encode(char* data, unsigned int count) {
	int length, length2;
	int blockCount;
	int paddingCount;

	length = count;

	if ((length % 3) == 0)
	{
		paddingCount = 0;
		blockCount = length / 3;
	}
	else
	{
		paddingCount = 3 - (length % 3);
		blockCount = (length + paddingCount) / 3;
	}

	length2 = length + paddingCount;

	char* source2 = malloc(length2);

	for (int x = 0; x < length2; x++)
	{
		if (x < length)
		{
			source2[x] = data[x];
		}
		else
		{
			source2[x] = 0;
		}
	}

	char b1, b2, b3;
	char temp, temp1, temp2, temp3, temp4;
	char* buffer = malloc(blockCount * 4);
	char* result = malloc(blockCount * 4);

	for (int x = 0; x < blockCount; x++)
	{
		b1 = source2[x * 3];
		b2 = source2[x * 3 + 1];
		b3 = source2[x * 3 + 2];

		temp1 = (char)((b1 & 252) >> 2);

		temp = (char)((b1 & 3) << 4);
		temp2 = (char)((b2 & 240) >> 4);
		temp2 += temp;

		temp = (char)((b2 & 15) << 2);
		temp3 = (char)((b3 & 192) >> 6);
		temp3 += temp;

		temp4 = (char)(b3 & 63);

		buffer[x * 4] = temp1;
		buffer[x * 4 + 1] = temp2;
		buffer[x * 4 + 2] = temp3;
		buffer[x * 4 + 3] = temp4;

	}

	for (int x = 0; x < blockCount * 4; x++)
	{
		result[x] = SixBitToChar(buffer[x]);
	}

	switch (paddingCount)
	{
	case 0:
		break;
	case 1:
		result[blockCount * 4 - 1] = '=';
		break;
	case 2:
		result[blockCount * 4 - 1] = '=';
		result[blockCount * 4 - 2] = '=';
		break;
	default:
		break;
	}

	free(source2);
	free(buffer);

	result[blockCount * 4] = '\0';

	return result;
}
								


Example

									char* data = "jdfgsdhfsdfsd 6445dsfsd7fg/*/+bfjsdgf%$^";
char* value = Encode(data, strlen(data));
								


Output

									amRmZ3NkaGZzZGZzZCA2NDQ1ZHNmc2Q3ZmcvKi8rYmZqc2RnZiUkXg==