1 #include "../include/base64.h"
\r
10 static const std::string base64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
\r
12 const bool Encode(const std::vector<unsigned char> &data, std::string &encoded)
\r
14 std::vector<unsigned char>::size_type currentdatapos=0;
\r
16 //reserve space for encoded data 4*input/3
\r
17 encoded.reserve((4L*data.size())/3L);
\r
18 while(currentdatapos<data.size())
\r
20 encoded.push_back(base64chars[(data[currentdatapos]>>2 & 0x3F)]);
\r
21 if(currentdatapos+1<data.size())
\r
23 encoded.push_back(base64chars[(data[currentdatapos]<<4 & 0x30) | (data[currentdatapos+1]>>4 & 0x0F)]);
\r
24 if(currentdatapos+2<data.size())
\r
26 encoded.push_back(base64chars[(data[currentdatapos+1]<<2 & 0x3C) | (data[currentdatapos+2]>>6 & 0x03)]);
\r
27 encoded.push_back(base64chars[(data[currentdatapos+2] & 0x3F)]);
\r
31 encoded.push_back(base64chars[(data[currentdatapos+1]<<2 & 0x3C)]);
\r
32 encoded.append("=");
\r
37 encoded.push_back(base64chars[(data[currentdatapos]<<4 & 0x30)]);
\r
38 encoded.append("==");
\r
45 const bool Decode(const std::string &encoded, std::vector<unsigned char> &data)
\r
47 std::string::size_type charpos=0;
\r
48 std::string::size_type encodedpos=0;
\r
49 unsigned char currentbyte=0;
\r
51 // reserve space for decoded data (encoded size*3/4)
\r
52 if(encoded.size()>1)
\r
54 data.reserve((encoded.size()*3)/4);
\r
57 // loop while encoded pos fits in current size
\r
58 while(encodedpos+3<encoded.size())
\r
61 charpos=base64chars.find(encoded[encodedpos]);
\r
62 if(charpos==std::string::npos)
\r
66 currentbyte=(charpos<<2 & 0xFC);
\r
67 charpos=base64chars.find(encoded[encodedpos+1]);
\r
68 if(charpos==std::string::npos)
\r
72 currentbyte|=(charpos>>4 & 0x03);
\r
73 data.push_back(currentbyte);
\r
74 currentbyte=(charpos<<4 & 0xF0);
\r
76 if(encoded[encodedpos+2]!='=')
\r
78 charpos=base64chars.find(encoded[encodedpos+2]);
\r
79 if(charpos==std::string::npos)
\r
83 currentbyte|=(charpos>>2 & 0x0F);
\r
84 data.push_back(currentbyte);
\r
85 currentbyte=(charpos<<6 & 0xC0);
\r
88 if(encoded[encodedpos+2]!='=')
\r
90 charpos=base64chars.find(encoded[encodedpos+3]);
\r
91 if(charpos==std::string::npos)
\r
95 currentbyte|=(charpos & 0x3F);
\r
96 data.push_back(currentbyte);
\r