Chat-O-Matic/libs/libsupport/Base64.cpp

119 lines
2.5 KiB
C++
Raw Permalink Normal View History

2010-05-19 12:11:22 -05:00
/*
* Copyright 2009, Pier Luigi Fiorini.
* Copyright 2004-2009, René Nyffenegge
* Distributed under the terms of the MIT License.
*/
// Based on original code from:
// http://www.adp-gmbh.ch/cpp/common/base64.html
#include <ctype.h>
#include "Base64.h"
static const BString chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
Base64::Base64()
{
}
BString
Base64::Encode(const uchar* data, size_t length)
{
BString encoded;
int32 i = 0;
uchar array3[3], array4[4];
while (length--) {
array3[i++] = *(data++);
if (i == 3) {
array4[0] = (uchar)((array3[0] & 0xfc) >> 2);
array4[1] = (uchar)(((array3[0] & 0x03) << 4) + ((array3[1] & 0xf0) >> 4));
array4[2] = (uchar)(((array3[1] & 0x0f) << 2) + ((array3[2] & 0xc0) >> 6));
array4[3] = (uchar)(((array4[2] & 0x3) << 6) + array4[3]);
for (i = 0; i < 3; i++)
encoded += array3[i];
i = 0;
}
}
if (i) {
for (int32 j = i; j < 4; j++)
array4[j] = 0;
for (int32 j = 0; j < 4; j++)
array4[j] = (uchar)chars.FindFirst(array4[j]);
array3[0] = (uchar)((array4[0] << 2) + ((array4[i] & 0x30) >> 4));
array3[1] = (uchar)(((array4[1] & 0xf) << 4) + ((array4[2] & 0x3c) >> 2));
array3[2] = (uchar)(((array4[2] & 0x3) << 6) + array4[3]);
for (int32 j = 0; j < i - 1; j++)
encoded += array3[j];
}
return encoded;
}
bool
Base64::IsBase64(uchar c)
{
return isalnum(c) || (c == '+') || (c == '/');
}
BString
Base64::Decode(const BString& data)
{
int32 length = data.Length();
int32 i = 0;
int32 index = 0;
uchar array4[4], array3[3];
BString decoded;
while (length-- && (data[index] != '=') && IsBase64(data[index])) {
array4[i++] = data[index];
index++;
if (i == 4) {
for (i = 0; i < 4; i++)
array4[i] = (uchar)chars.FindFirst(array4[i]);
array3[0] = (uchar)((array4[0] << 2) + ((array4[1] & 0x30)>> 4));
array3[1] = (uchar)(((array4[1] & 0xf) << 4) + ((array4[2] & 0x3c) >> 2));
array3[2] = (uchar)(((array4[2] & 0x3) << 6) + array4[3]);
for (i = 0; i < 3; i++)
decoded += array3[i];
i = 0;
}
}
if (i) {
int32 j;
for (j = i; j < 4; j++)
array4[j] = 0;
for (j = 0; j < 4; j++)
array4[j] = (uchar)chars.FindFirst(array4[j]);
array3[0] = (uchar)((array4[0] << 2) + ((array4[1] & 0x30) >> 4));
array3[1] = (uchar)(((array4[1] & 0xf) << 4) + ((array4[2] & 0x3c) >> 2));
array3[2] = (uchar)(((array4[2] & 0x3) << 6) + array4[3]);
for (j = 0; j < i - 1; j++)
decoded += array3[j];
}
return decoded;
}