28 static const char lookup[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
29 auto* source =
static_cast<const uint8*
> (sourceData);
31 while (sourceDataSize > 0)
34 auto byte0 = *source++;
35 frame[0] = lookup [(byte0 & 0xfcu) >> 2];
36 uint32 bits = (byte0 & 0x03u) << 4;
38 if (sourceDataSize > 1)
40 auto byte1 = *source++;
41 frame[1] = lookup[bits | ((byte1 & 0xf0u) >> 4)];
42 bits = (byte1 & 0x0fu) << 2;
44 if (sourceDataSize > 2)
46 auto byte2 = *source++;
47 frame[2] = lookup[bits | ((byte2 & 0xc0u) >> 6)];
48 frame[3] = lookup[byte2 & 0x3fu];
53 frame[2] = lookup[bits];
60 frame[1] = lookup[bits];
66 if (! base64Result.
write (frame, 4))
75 for (
auto s = base64TextInput.
text; ! s.isEmpty();)
79 for (
int i = 0; i < 4; ++i)
81 auto c = (uint32) s.getAndAdvance();
83 if (c >=
'A' && c <=
'Z') c -=
'A';
84 else if (c >=
'a' && c <=
'z') c -=
'a' - 26;
85 else if (c >=
'0' && c <=
'9') c += 52 -
'0';
86 else if (c ==
'+') c = 62;
87 else if (c ==
'/') c = 63;
88 else if (c ==
'=') { c = 64;
if (i <= 1)
return false; }
94 binaryOutput.
writeByte ((
char) ((data[0] << 2) | (data[1] >> 4)));
98 binaryOutput.
writeByte ((
char) ((data[1] << 4) | (data[2] >> 2)));
101 binaryOutput.
writeByte ((
char) ((data[2] << 6) | data[3]));
111 [[maybe_unused]]
bool ok =
convertToBase64 (m, sourceData, sourceDataSize);
126class Base64Tests final :
public UnitTest
130 :
UnitTest (
"Base64 class", UnitTestCategories::text)
133 static MemoryBlock createRandomData (Random& r)
135 MemoryOutputStream m;
137 for (
int i = r.nextInt (400); --i >= 0;)
138 m.writeByte ((
char) r.nextInt (256));
140 return m.getMemoryBlock();
143 void runTest()
override
145 beginTest (
"Base64");
147 auto r = getRandom();
149 for (
int i = 1000; --i >= 0;)
151 auto original = createRandomData (r);
153 MemoryOutputStream out;
155 auto result = out.getMemoryBlock();
156 expect (result == original);
161static Base64Tests base64Tests;
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual bool writeByte(char byte)
String::CharPointerType text
const char * toRawUTF8() const
static bool convertToBase64(OutputStream &base64Result, const void *sourceData, size_t sourceDataSize)
static String toBase64(const void *sourceData, size_t sourceDataSize)
static bool convertFromBase64(OutputStream &binaryOutput, StringRef base64TextInput)