@@ -264,3 +264,144 @@ size_t Print::printFloat(double number, uint8_t digits)
264264
265265 return n;
266266}
267+
268+ String base64_encode (const String &input)
269+ {
270+ String encoded;
271+ int input_length = input.length ();
272+ int i = 0 ;
273+ uint8_t char_array_3[3 ];
274+ uint8_t char_array_4[4 ];
275+
276+ const uint8_t * data = (const uint8_t *)input.c_str ();
277+
278+ while (input_length--)
279+ {
280+ char_array_3[i++] = *(data++);
281+ if (i == 3 )
282+ {
283+ char_array_4[0 ] = (char_array_3[0 ] & 0xfc ) >> 2 ;
284+ char_array_4[1 ] = ((char_array_3[0 ] & 0x03 ) << 4 ) + ((char_array_3[1 ] & 0xf0 ) >> 4 );
285+ char_array_4[2 ] = ((char_array_3[1 ] & 0x0f ) << 2 ) + ((char_array_3[2 ] & 0xc0 ) >> 6 );
286+ char_array_4[3 ] = char_array_3[2 ] & 0x3f ;
287+
288+ for (i = 0 ; (i < 4 ); i++)
289+ {
290+ char c;
291+ memcpy_P (&c, &base64_chars[char_array_4[i]], sizeof (char ));
292+ encoded += c;
293+ }
294+ i = 0 ;
295+ }
296+ }
297+
298+ if (i)
299+ {
300+ for (int j = i; j < 3 ; j++)
301+ char_array_3[j] = ' \0 ' ;
302+
303+ char_array_4[0 ] = (char_array_3[0 ] & 0xfc ) >> 2 ;
304+ char_array_4[1 ] = ((char_array_3[0 ] & 0x03 ) << 4 ) + ((char_array_3[1 ] & 0xf0 ) >> 4 );
305+ char_array_4[2 ] = ((char_array_3[1 ] & 0x0f ) << 2 ) + ((char_array_3[2 ] & 0xc0 ) >> 6 );
306+ char_array_4[3 ] = char_array_3[2 ] & 0x3f ;
307+
308+ for (int j = 0 ; (j < i + 1 ); j++)
309+ {
310+ char c;
311+ memcpy_P (&c, &base64_chars[char_array_4[j]], sizeof (char ));
312+ encoded += c;
313+ }
314+
315+ while ((i++ < 3 ))
316+ encoded += ' =' ;
317+ }
318+
319+ return encoded;
320+ }
321+
322+ String base64_decode (const String &input)
323+ {
324+ String decoded;
325+ int input_length = input.length ();
326+ uint8_t char_array_4[4 ], char_array_3[3 ];
327+ int i = 0 , j = 0 ;
328+
329+ while (input_length-- && (input[i] != ' =' ) && (isalnum (input[i]) || (input[i] == ' +' ) || (input[i] == ' /' )))
330+ {
331+ char_array_4[j++] = input[i];
332+ i++;
333+ if (j == 4 )
334+ {
335+ for (j = 0 ; j < 4 ; j++)
336+ {
337+ if (char_array_4[j] >= ' A' && char_array_4[j] <= ' Z' )
338+ {
339+ char_array_4[j] -= ' A' ;
340+ } else if (char_array_4[j] >= ' a' && char_array_4[j] <= ' z' )
341+ {
342+ char_array_4[j] -= ' a' - 26 ;
343+ } else if (char_array_4[j] >= ' 0' && char_array_4[j] <= ' 9' ) {
344+ char_array_4[j] -= ' 0' - 52 ;
345+ } else if (char_array_4[j] == ' +' ) {
346+ char_array_4[j] = 62 ;
347+ } else if (char_array_4[j] == ' /' ) {
348+ char_array_4[j] = 63 ;
349+ } else {
350+ char_array_4[j] = 0 ; // Invalid character
351+ }
352+ }
353+
354+ char_array_3[0 ] = (char_array_4[0 ] << 2 ) + ((char_array_4[1 ] & 0x30 ) >> 4 );
355+ char_array_3[1 ] = ((char_array_4[1 ] & 0xf ) << 4 ) + ((char_array_4[2 ] & 0x3c ) >> 2 );
356+ char_array_3[2 ] = ((char_array_4[2 ] & 0x3 ) << 6 ) + char_array_4[3 ];
357+
358+ for (j = 0 ; (j < 3 ); j++)
359+ {
360+ decoded += (char )char_array_3[j];
361+ }
362+ j = 0 ;
363+ }
364+ }
365+
366+ if (j)
367+ {
368+ for (int k = j; k < 4 ; k++)
369+ {
370+ char_array_4[k] = 0 ;
371+ }
372+
373+ for (int k = 0 ; k < 4 ; k++)
374+ {
375+ if (char_array_4[k] >= ' A' && char_array_4[k] <= ' Z' )
376+ {
377+ char_array_4[k] -= ' A' ;
378+ } else if (char_array_4[k] >= ' a' && char_array_4[k] <= ' z' )
379+ {
380+ char_array_4[k] -= ' a' - 26 ;
381+ } else if (char_array_4[k] >= ' 0' && char_array_4[k] <= ' 9' )
382+ {
383+ char_array_4[k] -= ' 0' - 52 ;
384+ } else if (char_array_4[k] == ' +' )
385+ {
386+ char_array_4[k] = 62 ;
387+ } else if (char_array_4[k] == ' /' )
388+ {
389+ char_array_4[k] = 63 ;
390+ } else {
391+ char_array_4[k] = 0 ; // Invalid character
392+ }
393+ }
394+
395+ char_array_3[0 ] = (char_array_4[0 ] << 2 ) + ((char_array_4[1 ] & 0x30 ) >> 4 );
396+ char_array_3[1 ] = ((char_array_4[1 ] & 0xf ) << 4 ) + ((char_array_4[2 ] & 0x3c ) >> 2 );
397+ char_array_3[2 ] = ((char_array_4[2 ] & 0x3 ) << 6 ) + char_array_4[3 ];
398+
399+ for (int k = 0 ; (k < j - 1 ); k++)
400+ {
401+ decoded += (char )char_array_3[k];
402+ }
403+ }
404+
405+ return decoded;
406+ }
407+
0 commit comments