123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /*
- * 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;
- }
|