Skip to content

Added base64 Print.cpp #583

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Added base64 Print.cpp
Added  base64 encode decode function
  • Loading branch information
toaha63 authored Dec 27, 2024
commit 49952f5a53908668ff10f6cfb65b01d4d0e5e478
141 changes: 141 additions & 0 deletions cores/arduino/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,144 @@ size_t Print::printFloat(double number, uint8_t digits)

return n;
}

String base64_encode(const String &input)
{
String encoded;
int input_length = input.length();
int i = 0;
uint8_t char_array_3[3];
uint8_t char_array_4[4];

const uint8_t* data = (const uint8_t*)input.c_str();

while (input_length--)
{
char_array_3[i++] = *(data++);
if (i == 3)
{
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;

for (i = 0; (i < 4); i++)
{
char c;
memcpy_P(&c, &base64_chars[char_array_4[i]], sizeof(char));
encoded += c;
}
i = 0;
}
}

if(i)
{
for (int j = i; j < 3; j++)
char_array_3[j] = '\0';

char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;

for (int j = 0; (j < i + 1); j++)
{
char c;
memcpy_P(&c, &base64_chars[char_array_4[j]], sizeof(char));
encoded += c;
}

while ((i++ < 3))
encoded += '=';
}

return encoded;
}

String base64_decode(const String &input)
{
String decoded;
int input_length = input.length();
uint8_t char_array_4[4], char_array_3[3];
int i = 0, j = 0;

while (input_length-- && (input[i] != '=') && (isalnum(input[i]) || (input[i] == '+') || (input[i] == '/')))
{
char_array_4[j++] = input[i];
i++;
if (j == 4)
{
for (j = 0; j < 4; j++)
{
if (char_array_4[j] >= 'A' && char_array_4[j] <= 'Z')
{
char_array_4[j] -= 'A';
} else if (char_array_4[j] >= 'a' && char_array_4[j] <= 'z')
{
char_array_4[j] -= 'a' - 26;
} else if (char_array_4[j] >= '0' && char_array_4[j] <= '9') {
char_array_4[j] -= '0' - 52;
} else if (char_array_4[j] == '+') {
char_array_4[j] = 62;
} else if (char_array_4[j] == '/') {
char_array_4[j] = 63;
} else {
char_array_4[j] = 0; // Invalid character
}
}

char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

for (j = 0; (j < 3); j++)
{
decoded += (char)char_array_3[j];
}
j = 0;
}
}

if(j)
{
for (int k = j; k < 4; k++)
{
char_array_4[k] = 0;
}

for (int k = 0; k < 4; k++)
{
if (char_array_4[k] >= 'A' && char_array_4[k] <= 'Z')
{
char_array_4[k] -= 'A';
} else if (char_array_4[k] >= 'a' && char_array_4[k] <= 'z')
{
char_array_4[k] -= 'a' - 26;
} else if (char_array_4[k] >= '0' && char_array_4[k] <= '9')
{
char_array_4[k] -= '0' - 52;
} else if (char_array_4[k] == '+')
{
char_array_4[k] = 62;
} else if (char_array_4[k] == '/')
{
char_array_4[k] = 63;
} else {
char_array_4[k] = 0; // Invalid character
}
}

char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

for(int k = 0; (k < j - 1); k++)
{
decoded += (char)char_array_3[k];
}
}

return decoded;
}

Loading