28 #ifndef SCRIBO_CONVERT_TO_BASE64_HH
29 # define SCRIBO_CONVERT_TO_BASE64_HH
66 # include <mln/border/resize.hh>
67 # include <mln/core/image/image2d.hh>
68 # include <mln/util/array.hh>
71 # define B64_DEF_LINE_SIZE 72
87 # ifndef MLN_INCLUDE_ONLY
96 static const char cb64[]=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
105 encodeblock(
unsigned char in[3],
unsigned char out[4],
int len)
107 out[0] = cb64[ in[0] >> 2 ];
108 out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
109 out[2] = (
unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] :
'=');
110 out[3] = (
unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] :
'=');
117 template <
typename I>
121 mln_trace(
"scribo::convert::to_base64");
123 mln_precondition(
exact(input_).is_valid());
124 using namespace internal;
126 const I& input =
exact(input_);
128 unsigned char in[3], out[4];
129 int i, len, blocksout = 0;
136 *end_ptr = (
unsigned char *) (input.buffer() + input.nelements()),
137 *ptr = (
unsigned char *)input.buffer();
139 while(ptr != end_ptr)
142 for(i = 0; i < 3; ++i)
146 in[i] = (
unsigned char) *ptr++;
158 encodeblock(in, out, len);
159 for(i = 0; i < 4; ++i)
163 if(blocksout >= (B64_DEF_LINE_SIZE/4) || ptr == end_ptr)
176 # endif // ! MLN_INCLUDE_ONLY
178 # undef B64_DEF_LINE_SIZE
184 #endif // ! SCRIBO_CONVERT_TO_BASE64_HH