Logo ROOT   6.08/07
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 
15 This code implements the Base64 encoding and decoding.
16 
17 Base64 encoded messages are typically used in authentication
18 protocols 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 
31 static 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 
72 static 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 
116 {
117  return Encode(data, strlen(data));
118 }
119 
120 ////////////////////////////////////////////////////////////////////////////////
121 /// Transform len bytes from data into a null terminated base64 string.
122 
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 
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 }
This code implements the Base64 encoding and decoding.
Definition: TBase64.h:33
static int ToB64low(const char *in, char *out, int mod)
Base64 encoding of 3 bytes from in.
Definition: TBase64.cxx:31
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
Definition: TBase64.cxx:142
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
Definition: TBase64.cxx:115
TString & Append(const char *cs)
Definition: TString.h:492
static int FromB64low(const char *in, TString &out)
Base64 decoding of 4 bytes from in.
Definition: TBase64.cxx:72
unsigned int UInt_t
Definition: RtypesCore.h:42
#define ClassImp(name)
Definition: Rtypes.h:279