31 static int ToB64low(
const char *in,
char *out,
int mod)
33 static char b64ref[64] = {
34 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
35 'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
36 'U',
'V',
'W',
'X',
'Y',
'Z',
37 'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
38 'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
39 'u',
'v',
'w',
'x',
'y',
'z',
40 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
48 *out++ = b64ref[ 0x3F & (in[0] >> 2) ];
49 *out++ = b64ref[ 0x3F & (0x30 & (in[0] << 4)) ];
52 }
else if (mod == 2) {
53 *out++ = b64ref[ 0x3F & (in[0] >> 2) ];
54 *out++ = b64ref[ 0x3F & ((0x30 & (in[0] << 4)) | (0x0F & (in[1] >> 4))) ];
55 *out++ = b64ref[ 0x3F & (0x3C & (in[1] << 2)) ];
58 *out++ = b64ref[ (int)(0x3F & (in[0] >> 2)) ];
59 *out++ = b64ref[ 0x3F & ((0x30 & (in[0] << 4)) | (0x0F & (in[1] >> 4))) ];
60 *out++ = b64ref[ 0x3F & ((0x3C & (in[1] << 2)) | (0x03 & (in[2] >> 6))) ];
61 *out++ = b64ref[ 0x3F & in[2] ];
74 static int b64inv[256] = {
75 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
76 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
77 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
78 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,
79 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
80 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
81 -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
82 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
83 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
84 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
85 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
86 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
87 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
88 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
89 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
90 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
98 out.
Append((
char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
99 out.
Append((
char)(0xF0 & (b64inv[i1] << 4)) | (0x0F & (b64inv[i2] >> 2)));
100 out.
Append((
char)(0xC0 & (b64inv[i2] << 6)) | (0x3F & b64inv[i3]));
102 }
else if (in[2] ==
'=') {
103 out.
Append((
char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
106 out.
Append((
char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
107 out.
Append((
char)(0xF0 & (b64inv[i1] << 4)) | (0x0F & (b64inv[i2] >> 2)));
117 return Encode(data, strlen(data));
129 for (
int i = 0; i < len; i += 3) {
144 int len = strlen(data);
147 for (
int i = 0; i < len; i += 4)
This code implements the Base64 encoding and decoding.
static int ToB64low(const char *in, char *out, int mod)
Base64 encoding of 3 bytes from in.
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
TString & Append(const char *cs)
static int FromB64low(const char *in, TString &out)
Base64 decoding of 4 bytes from in.