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))
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]));
130 Base64Tests() :
UnitTest (
"Base64 class",
"Text") {}
132 static MemoryBlock createRandomData (Random& r)
134 MemoryOutputStream m;
136 for (
int i = r.nextInt (400); --i >= 0;)
137 m.writeByte ((
char) r.nextInt (256));
139 return m.getMemoryBlock();
142 void runTest()
override
144 beginTest (
"Base64");
146 auto r = getRandom();
148 for (
int i = 1000; --i >= 0;)
150 auto original = createRandomData (r);
152 MemoryOutputStream out;
154 auto result = out.getMemoryBlock();
155 expect (result == original);
160 static Base64Tests base64Tests;