return 255;
}
+static uint8_t foleo_base64_encode1(uint8_t v)
+{
+ switch (v)
+ {
+ case 0: return 'A';
+ case 1: return 'B';
+ case 2: return 'C';
+ case 3: return 'D';
+ case 4: return 'E';
+ case 5: return 'F';
+ case 6: return 'G';
+ case 7: return 'H';
+ case 8: return 'I';
+ case 9: return 'J';
+ case 10: return 'K';
+ case 11: return 'L';
+ case 12: return 'M';
+ case 13: return 'N';
+ case 14: return 'O';
+ case 15: return 'P';
+ case 16: return 'Q';
+ case 17: return 'R';
+ case 18: return 'S';
+ case 19: return 'T';
+ case 20: return 'U';
+ case 21: return 'V';
+ case 22: return 'W';
+ case 23: return 'X';
+ case 24: return 'Y';
+ case 25: return 'Z';
+ case 26: return 'a';
+ case 27: return 'b';
+ case 28: return 'c';
+ case 29: return 'd';
+ case 30: return 'e';
+ case 31: return 'f';
+ case 32: return 'g';
+ case 33: return 'h';
+ case 34: return 'i';
+ case 35: return 'j';
+ case 36: return 'k';
+ case 37: return 'l';
+ case 38: return 'm';
+ case 39: return 'n';
+ case 40: return 'o';
+ case 41: return 'p';
+ case 42: return 'q';
+ case 43: return 'r';
+ case 44: return 's';
+ case 45: return 't';
+ case 46: return 'u';
+ case 47: return 'v';
+ case 48: return 'w';
+ case 49: return 'x';
+ case 50: return 'y';
+ case 51: return 'z';
+ case 52: return '0';
+ case 53: return '1';
+ case 54: return '2';
+ case 55: return '3';
+ case 56: return '4';
+ case 57: return '5';
+ case 58: return '6';
+ case 59: return '7';
+ case 60: return '8';
+ case 61: return '9';
+ case 62: return '+';
+ case 63: return '/';
+ }
+ return 255;
+}
+
uint8_t* foleo_base64_decode(uint8_t* b64, size_t *r)
{
uint32_t size = strlen(b64);
uint32_t retS = 0;
uint16_t buffer = 0;
uint8_t bufferS = 0;
- for (uint32_t i = 0; i < size; i++)
+ for (size_t i = 0; i < size; i++)
{
if (b64[i] == '=') { bufferS = 0; continue; };
uint8_t val = foleo_base64_decode1(b64[i]);
*r = 0;
return NULL;
}
- //printf("Pre : %04x %i\n", buffer, bufferS);
buffer = (buffer << 6) | val;
bufferS += 6;
if (bufferS >= 8)
{
uint8_t shift = 16 - bufferS;
buffer <<= shift;
- //printf("Shift: %04x %i\n", buffer, bufferS);
ret = realloc(ret, ++retS);
ret[retS - 1] = buffer >> 8;
buffer = buffer & 0x00FF;
buffer >>= shift;
bufferS -= 8;
}
- //printf("Post : %04x %i\n", buffer, bufferS);
- //printf("--------------------------------\n");
}
if (bufferS > 0)
{
return ret;
}
+uint8_t* foleo_base64_encode(uint8_t* data, size_t dataS)
+{
+ uint8_t* ret = malloc(0);
+ size_t retS = 0;
+ uint16_t buffer = 0;
+ uint8_t bufferS = 0;
+ for (size_t i = 0; i < dataS; i++)
+ {
+ buffer = (buffer << 8) | data[i];
+ bufferS += 8;
+ buffer = buffer << (16 - bufferS);
+ uint8_t c = foleo_base64_encode1(buffer >> 10);
+ bufferS -= 6;
+ buffer <<= 6;
+ buffer >>= 16 - bufferS;
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = c;
+ }
+ switch (bufferS)
+ {
+ case 2:
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000000011) << 4);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ break;
+ case 4:
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000001111) << 2);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ break;
+ case 6:
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1(buffer);
+ break;
+ case 8:
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1(buffer >> 2);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000000011) << 4);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ break;
+ case 10:
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1(buffer >> 4);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = foleo_base64_encode1((buffer & 0b0000000000001111) << 2);
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = '=';
+ break;
+ }
+ ret = realloc(ret, retS + 1);
+ ret[retS++] = 0;
+ return ret;
+}
+
+static uint8_t foleo_hex_encode1(uint8_t v)
+{
+ switch (v)
+ {
+ case 0: return '0';
+ case 1: return '1';
+ case 2: return '2';
+ case 3: return '3';
+ case 4: return '4';
+ case 5: return '5';
+ case 6: return '6';
+ case 7: return '7';
+ case 8: return '8';
+ case 9: return '9';
+ case 10: return 'a';
+ case 11: return 'b';
+ case 12: return 'c';
+ case 13: return 'd';
+ case 14: return 'e';
+ case 15: return 'f';
+ }
+ return 255;
+}
+
static uint8_t foleo_hex_decode1(uint8_t v)
{
switch (v)
return ret;
}
+uint8_t* foleo_hex_encode(uint8_t* data, size_t dataS)
+{
+ uint8_t* ret = malloc(dataS * 2 + 1);
+ for (size_t i = 0; i < dataS; i++)
+ {
+ uint8_t cU = foleo_hex_encode1(data[i] >> 4);
+ uint8_t cL = foleo_hex_encode1(data[i] & 0xF);
+ ret[i * 2] = cU;
+ ret[i * 2 + 1] = cL;
+ }
+ ret[dataS * 2] = 0;
+ return ret;
+}
+
#endif
\ No newline at end of file