00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <ctype.h>
00019
00020 #include "Base64.h"
00021
00022 using std::string;
00023
00024 const char Base64::fillchar = '=';
00025 const string::size_type Base64::np = string::npos;
00026
00027
00028
00029 const string Base64::Base64Table("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
00030
00031
00032
00033
00034
00035 const string::size_type Base64::DecodeTable[] =
00036
00037 {np,np,np,np,np,np,np,np,np,np,
00038 np,np,np,np,np,np,np,np,np,np,
00039 np,np,np,np,np,np,np,np,np,np,
00040 np,np,np,np,np,np,np,np,np,np,
00041 np,np,np,62,np,np,np,63,52,53,
00042 54,55,56,57,58,59,60,61,np,np,
00043 np,np,np,np,np, 0, 1, 2, 3, 4,
00044 5, 6, 7, 8, 9,10,11,12,13,14,
00045 15,16,17,18,19,20,21,22,23,24,
00046 25,np,np,np,np,np,np,26,27,28,
00047 29,30,31,32,33,34,35,36,37,38,
00048 39,40,41,42,43,44,45,46,47,48,
00049 49,50,51,np,np,np,np,np,np,np,
00050 np,np,np,np,np,np,np,np,np,np,
00051 np,np,np,np,np,np,np,np,np,np,
00052 np,np,np,np,np,np,np,np,np,np,
00053 np,np,np,np,np,np,np,np,np,np,
00054 np,np,np,np,np,np,np,np,np,np,
00055 np,np,np,np,np,np,np,np,np,np,
00056 np,np,np,np,np,np,np,np,np,np,
00057 np,np,np,np,np,np,np,np,np,np,
00058 np,np,np,np,np,np,np,np,np,np,
00059 np,np,np,np,np,np,np,np,np,np,
00060 np,np,np,np,np,np,np,np,np,np,
00061 np,np,np,np,np,np,np,np,np,np,
00062 np,np,np,np,np,np
00063 };
00064
00065
00066 string Base64::encode(const string& data) {
00067 string::size_type i;
00068 char c;
00069 string::size_type len = data.length();
00070 string ret;
00071
00072 ret.reserve(len * 2);
00073
00074 for (i = 0; i < len; ++i)
00075 {
00076 c = (data[i] >> 2) & 0x3f;
00077 ret.append(1, Base64Table[c]);
00078 c = (data[i] << 4) & 0x3f;
00079 if (++i < len)
00080 c |= (data[i] >> 4) & 0x0f;
00081
00082 ret.append(1, Base64Table[c]);
00083 if (i < len)
00084 {
00085 c = (data[i] << 2) & 0x3f;
00086 if (++i < len)
00087 c |= (data[i] >> 6) & 0x03;
00088
00089 ret.append(1, Base64Table[c]);
00090 }
00091 else
00092 {
00093 ++i;
00094 ret.append(1, fillchar);
00095 }
00096
00097 if (i < len)
00098 {
00099 c = data[i] & 0x3f;
00100 ret.append(1, Base64Table[c]);
00101 }
00102 else
00103 {
00104 ret.append(1, fillchar);
00105 }
00106 }
00107
00108 return(ret);
00109 }
00110
00111 string Base64::decode(const string& data) {
00112 string::size_type i;
00113 char c;
00114 char c1;
00115 string::size_type len = data.length();
00116 string ret;
00117
00118 ret.reserve(len);
00119
00120 for (i = 0; i < len; ++i)
00121 {
00122 c = (char) DecodeTable[(unsigned char)data[i]];
00123 ++i;
00124 c1 = (char) DecodeTable[(unsigned char)data[i]];
00125 c = (c << 2) | ((c1 >> 4) & 0x3);
00126 ret.append(1, c);
00127 if (++i < len)
00128 {
00129 c = data[i];
00130 if (fillchar == c)
00131 break;
00132
00133 c = (char) DecodeTable[(unsigned char)data[i]];
00134 c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
00135 ret.append(1, c1);
00136 }
00137
00138 if (++i < len)
00139 {
00140 c1 = data[i];
00141 if (fillchar == c1)
00142 break;
00143
00144 c1 = (char) DecodeTable[(unsigned char)data[i]];
00145 c = ((c << 6) & 0xc0) | c1;
00146 ret.append(1, c);
00147 }
00148 }
00149
00150 return(ret);
00151 }
00152
00153 bool Base64::isPrintable(const string& s) {
00154 size_t i = 0;
00155 while (i < s.size() && (isprint(s[i]) || isspace(s[i]))) {
00156 i++;
00157 }
00158 return (i == s.size());
00159 }