00001 #ifndef _BOOST_RPC_BASE64_HPP
00002 #define _BOOST_RPC_BASE64_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <iostream>
00031
00032 namespace boost { namespace rpc {
00033
00034 inline const std::string& base64_chars()
00035 {
00036 static const std::string m_base64_chars =
00037 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
00038 "abcdefghijklmnopqrstuvwxyz"
00039 "0123456789+/";
00040 return m_base64_chars;
00041 }
00042
00043 static inline bool is_base64(unsigned char c) {
00044 return (isalnum(c) || (c == '_') || (c == '-'));
00045 }
00046
00047 inline std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
00048
00049 std::string ret;
00050 int i = 0;
00051 int j = 0;
00052 unsigned char char_array_3[3];
00053 unsigned char char_array_4[4];
00054
00055 while (in_len--) {
00056 char_array_3[i++] = *(bytes_to_encode++);
00057 if (i == 3) {
00058 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
00059 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
00060 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
00061 char_array_4[3] = char_array_3[2] & 0x3f;
00062
00063 for(i = 0; (i <4) ; i++)
00064 ret += base64_chars()[char_array_4[i]];
00065 i = 0;
00066 }
00067 }
00068
00069 if (i)
00070 {
00071 for(j = i; j < 3; j++)
00072 char_array_3[j] = '\0';
00073
00074 char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
00075 char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
00076 char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
00077 char_array_4[3] = char_array_3[2] & 0x3f;
00078
00079 for (j = 0; (j < i + 1); j++)
00080 ret += base64_chars()[char_array_4[j]];
00081
00082 while((i++ < 3))
00083 ret += '=';
00084
00085 }
00086
00087 return ret;
00088
00089 }
00090
00091
00092 inline std::string base64_decode(std::string const& encoded_string) {
00093
00094
00095 int in_len = encoded_string.size();
00096 int i = 0;
00097 int j = 0;
00098 int in_ = 0;
00099 unsigned char char_array_4[4], char_array_3[3];
00100 std::string ret;
00101
00102 while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
00103 char_array_4[i++] = encoded_string[in_]; in_++;
00104 if (i ==4) {
00105 for (i = 0; i <4; i++)
00106 char_array_4[i] = base64_chars().find(char_array_4[i]);
00107
00108 char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
00109 char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
00110 char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
00111
00112 for (i = 0; (i < 3); i++)
00113 ret += char_array_3[i];
00114 i = 0;
00115 }
00116 }
00117
00118 if (i) {
00119 for (j = i; j <4; j++)
00120 char_array_4[j] = 0;
00121
00122 for (j = 0; j <4; j++)
00123 char_array_4[j] = base64_chars().find(char_array_4[j]);
00124
00125 char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
00126 char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
00127 char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
00128
00129 for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
00130 }
00131
00132 return ret;
00133 }
00134
00135
00136 } }
00137 #endif // _BOOST_RPC_BASE64_HPP