Logo ROOT  
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 
23 #include <ROOT/RConfig.hxx>
24 
26 
27 ////////////////////////////////////////////////////////////////////////////////
28 /// Base64 encoding of 3 bytes from in.
29 /// Output (4 bytes) saved in out (not null terminated).
30 
31 static void 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 (R__likely(mod > 2)) {
45  *out++ = b64ref[ (int)(0x3F & (in[0] >> 2)) ];
46  *out++ = b64ref[ 0x3F & ((0x30 & (in[0] << 4)) | (0x0F & (in[1] >> 4))) ];
47  *out++ = b64ref[ 0x3F & ((0x3C & (in[1] << 2)) | (0x03 & (in[2] >> 6))) ];
48  *out++ = b64ref[ 0x3F & in[2] ];
49  } else if (mod == 1) {
50  *out++ = b64ref[ 0x3F & (in[0] >> 2) ];
51  *out++ = b64ref[ 0x3F & (0x30 & (in[0] << 4)) ];
52  *out++ = '=';
53  *out++ = '=';
54  } else if (mod == 2) {
55  *out++ = b64ref[ 0x3F & (in[0] >> 2) ];
56  *out++ = b64ref[ 0x3F & ((0x30 & (in[0] << 4)) | (0x0F & (in[1] >> 4))) ];
57  *out++ = b64ref[ 0x3F & (0x3C & (in[1] << 2)) ];
58  *out++ = '=';
59  }
60 }
61 
62 ////////////////////////////////////////////////////////////////////////////////
63 /// Base64 decoding of 4 bytes from in.
64 /// Output (3 bytes) appended to out.
65 /// No check for base64-ness of input characters.
66 
67 static void FromB64low(const char *in, TString &out)
68 {
69  static int b64inv[256] = {
70  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
71  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
72  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
73  52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,
74  -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
75  15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
76  -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
77  41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
78  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
79  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
80  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
81  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
82  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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  };
87 
88  const UInt_t i0 = (UInt_t)(in[0]);
89  const UInt_t i1 = (UInt_t)(in[1]);
90  const UInt_t i2 = (UInt_t)(in[2]);
91  const UInt_t i3 = (UInt_t)(in[3]);
92  if (R__likely(in[3] != '=')) {
93  out.Append((char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
94  out.Append((char)(0xF0 & (b64inv[i1] << 4)) | (0x0F & (b64inv[i2] >> 2)));
95  out.Append((char)(0xC0 & (b64inv[i2] << 6)) | (0x3F & b64inv[i3]));
96  } else if (in[2] == '=') {
97  out.Append((char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
98  } else {
99  out.Append((char)(0xFC & (b64inv[i0] << 2)) | (0x03 & (b64inv[i1] >> 4)));
100  out.Append((char)(0xF0 & (b64inv[i1] << 4)) | (0x0F & (b64inv[i2] >> 2)));
101  }
102 }
103 
104 ////////////////////////////////////////////////////////////////////////////////
105 /// Transform data into a null terminated base64 string.
106 
107 TString TBase64::Encode(const char *data)
108 {
109  return Encode(data, strlen(data));
110 }
111 
112 ////////////////////////////////////////////////////////////////////////////////
113 /// Transform len bytes from data into a null terminated base64 string.
114 
115 TString TBase64::Encode(const char *data, Int_t len)
116 {
117  TString ret((len < 8) ? 16 : (int) (len * 1.25 + 8)); // every 3 bytes coded in 4 base64
118 
119  char oo[4];
120  for (int i = 0; i < len; i += 3) {
121  ToB64low(data+i, oo, len-i);
122  ret.Append(oo, 4);
123  }
124  return ret;
125 }
126 
127 ////////////////////////////////////////////////////////////////////////////////
128 /// Decode a base64 string date into a generic TString.
129 /// No check for base64-ness of input characters.
130 
131 TString TBase64::Decode(const char *data)
132 {
133  int len = strlen(data);
134  TString ret(len);
135 
136  for (int i = 0; i < len; i += 4)
137  FromB64low(data+i, ret);
138 
139  return ret;
140 }
ClassImp
#define ClassImp(name)
Definition: Rtypes.h:364
TBase64::Decode
static TString Decode(const char *data)
Decode a base64 string date into a generic TString.
Definition: TBase64.cxx:131
R__likely
#define R__likely(expr)
Definition: RConfig.hxx:605
TBase64::Encode
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
Definition: TBase64.cxx:107
RConfig.hxx
TString
Definition: TString.h:136
TBase64.h
TBase64
Definition: TBase64.h:29
TString::Append
TString & Append(const char *cs)
Definition: TString.h:564
UInt_t
unsigned int UInt_t
Definition: RtypesCore.h:46
ToB64low
static void ToB64low(const char *in, char *out, int mod)
Base64 encoding of 3 bytes from in.
Definition: TBase64.cxx:31
FromB64low
static void FromB64low(const char *in, TString &out)
Base64 decoding of 4 bytes from in.
Definition: TBase64.cxx:67
int