@@ -264,3 +264,144 @@ size_t Print::printFloat(double number, uint8_t digits)
264
264
265
265
return n;
266
266
}
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