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
108{
109 return Encode(data, strlen(data));
110}
111
112////////////////////////////////////////////////////////////////////////////////
113/// Transform len bytes from data into a null terminated base64 string.
114
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
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:596
unsigned int UInt_t
Definition: RtypesCore.h:46
#define ClassImp(name)
Definition: Rtypes.h:375
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
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
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:136
TString & Append(const char *cs)
Definition: TString.h:564