Logo ROOT   6.18/05
Reference Guide
TBase64.cxx
Go to the documentation of this file.
1// @(#)root/base:$Id$
2// Author: Gerardo Ganis + Fons Rademakers 15/5/2009
3
4/*************************************************************************
5 * Copyright (C) 1995-2009, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TBase64
13\ingroup Base
14
15This code implements the Base64 encoding and decoding.
16
17Base64 encoded messages are typically used in authentication
18protocols and to pack binary data in HTTP messages.
19*/
20
21#include "TBase64.h"
22
24
25////////////////////////////////////////////////////////////////////////////////
26/// Base64 encoding of 3 bytes from in.
27/// Output (4 bytes) saved in out (not null terminated).
28/// Returns 0 on success, -1 if input or output arrays are
29/// not defined.
30
31static int ToB64low(const char *in, char *out, int mod)
32{
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',
41 '+','/'
42 };
43
44 if (!in || !out)
45 return -1;
46
47 if (mod == 1) {
48 *out++ = b64ref[ 0x3F & (in[0] >> 2) ];
49 *out++ = b64ref[ 0x3F & (0x30 & (in[0] << 4)) ];
50 *out++ = '=';
51 *out++ = '=';
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)) ];
56 *out++ = '=';
57 } else {
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] ];
62 }
63
64 return 0;
65}
66
67////////////////////////////////////////////////////////////////////////////////
68/// Base64 decoding of 4 bytes from in.
69/// Output (3 bytes) returned in out.
70/// No check for base64-ness of input characters.
71
72static int FromB64low(const char *in, TString &out)
73{
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
91 };
92
93 UInt_t i0 = (UInt_t)(in[0]);
94 UInt_t i1 = (UInt_t)(in[1]);
95 UInt_t i2 = (UInt_t)(in[2]);
96 UInt_t i3 = (UInt_t)(in[3]);
97 if (in[3] != '=') {
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]));
101 return 3;
102 } else if (in[2] == '=') {
103 out.Append((char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
104 return 1;
105 } else {
106 out.Append((char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
107 out.Append((char)(0xF0 & (b64inv[i1] << 4)) | (0x0F & (b64inv[i2] >> 2)));
108 return 2;
109 }
110}
111
112////////////////////////////////////////////////////////////////////////////////
113/// Transform data into a null terminated base64 string.
114
115TString TBase64::Encode(const char *data)
116{
117 return Encode(data, strlen(data));
118}
119
120////////////////////////////////////////////////////////////////////////////////
121/// Transform len bytes from data into a null terminated base64 string.
122
123TString TBase64::Encode(const char *data, Int_t len)
124{
125 TString ret(len * 2);
126
127 int mod = 0;
128 char oo[5] = {0};
129 for (int i = 0; i < len; i += 3) {
130 mod = len-i;
131 ToB64low(data+i, oo, mod);
132 oo[4] = 0;
133 ret += oo;
134 }
135 return ret;
136}
137
138////////////////////////////////////////////////////////////////////////////////
139/// Decode a base64 string date into a generic TString.
140/// No check for base64-ness of input characters.
141
142TString TBase64::Decode(const char *data)
143{
144 int len = strlen(data);
145 TString ret(len);
146
147 for (int i = 0; i < len; i += 4)
148 FromB64low(data+i, ret);
149
150 return ret;
151}
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
#define ClassImp(name)
Definition: Rtypes.h:365
static int ToB64low(const char *in, char *out, int mod)
Base64 encoding of 3 bytes from in.
Definition: TBase64.cxx:31
static int FromB64low(const char *in, TString &out)
Base64 decoding of 4 bytes from in.
Definition: TBase64.cxx:72
This code implements the Base64 encoding and decoding.
Definition: TBase64.h:29
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
Definition: TBase64.cxx:142
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
Definition: TBase64.cxx:115
Basic string class.
Definition: TString.h:131
TString & Append(const char *cs)
Definition: TString.h:559