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
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
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
31static 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
67static 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
107TString 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
115TString 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
131TString 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}
#define R__likely(expr)
Definition: RConfig.hxx:605
unsigned int UInt_t
Definition: RtypesCore.h:44
#define ClassImp(name)
Definition: Rtypes.h:361
static void FromB64low(const char *in, TString &out)
Base64 decoding of 4 bytes from in.
Definition: TBase64.cxx:67
static void ToB64low(const char *in, char *out, int mod)
Base64 encoding of 3 bytes from in.
Definition: TBase64.cxx:31
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:131
static TString Encode(const char *data)
Transform data into a null terminated base64 string.
Definition: TBase64.cxx:107
Basic string class.
Definition: TString.h:131
TString & Append(const char *cs)
Definition: TString.h:559