Skip to content

Commit 49952f5

Browse files
authored
Added base64 Print.cpp
Added base64 encode decode function
1 parent c8c514c commit 49952f5

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

Diff for: cores/arduino/Print.cpp

+141
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)