-
Notifications
You must be signed in to change notification settings - Fork 0
/
base64_8cpp_source.html
134 lines (132 loc) · 38.6 KB
/
base64_8cpp_source.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>tlx: tlx/string/base64.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
extensions: ["tex2jax.js"],
jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">tlx
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>File Members</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('base64_8cpp_source.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">base64.cpp</div> </div>
</div><!--header-->
<div class="contents">
<a href="base64_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * tlx/string/base64.cpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Part of tlx - http://panthema.net/tlx</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Copyright (C) 2007-2017 Timo Bingmann <[email protected]></span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * All rights reserved. Published under the Boost Software License, Version 1.0</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> ******************************************************************************/</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <<a class="code" href="base64_8hpp.html">tlx/string/base64.hpp</a>></span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include <stdexcept></span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> </div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="keyword">namespace </span><a class="code" href="namespacetlx.html">tlx</a> {</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment">/*</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment"> * Code in this file is based on source code from http://libb64.sourceforge.net/</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment"> * which is in the public domain.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"> */</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">/******************************************************************************/</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">// Base64 Encoding and Decoding</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="group__tlx__string.html#ga691477f59c8496eec65e994ce3f6e6e5"> 25</a></span> std::string <a class="code" href="group__tlx__string.html#ga691477f59c8496eec65e994ce3f6e6e5">base64_encode</a>(<span class="keyword">const</span> <span class="keywordtype">void</span>* data, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> line_break) {</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="keyword">const</span> uint8_t* in = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t*<span class="keyword">></span>(data);</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  <span class="keyword">const</span> uint8_t* in_end = in + size;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  std::string out;</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keywordflow">if</span> (size == 0) <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="comment">// calculate output string's size in advance</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keywordtype">size_t</span> outsize = (((size - 1) / 3) + 1) * 4;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">if</span> (line_break > 0) outsize += outsize / line_break;</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  out.reserve(outsize);</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> </div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> encoding64[64] = {</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="charliteral">'A'</span>, <span class="charliteral">'B'</span>, <span class="charliteral">'C'</span>, <span class="charliteral">'D'</span>, <span class="charliteral">'E'</span>, <span class="charliteral">'F'</span>, <span class="charliteral">'G'</span>, <span class="charliteral">'H'</span>, <span class="charliteral">'I'</span>, <span class="charliteral">'J'</span>, <span class="charliteral">'K'</span>, <span class="charliteral">'L'</span>, <span class="charliteral">'M'</span>,</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="charliteral">'N'</span>, <span class="charliteral">'O'</span>, <span class="charliteral">'P'</span>, <span class="charliteral">'Q'</span>, <span class="charliteral">'R'</span>, <span class="charliteral">'S'</span>, <span class="charliteral">'T'</span>, <span class="charliteral">'U'</span>, <span class="charliteral">'V'</span>, <span class="charliteral">'W'</span>, <span class="charliteral">'X'</span>, <span class="charliteral">'Y'</span>, <span class="charliteral">'Z'</span>,</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="charliteral">'a'</span>, <span class="charliteral">'b'</span>, <span class="charliteral">'c'</span>, <span class="charliteral">'d'</span>, <span class="charliteral">'e'</span>, <span class="charliteral">'f'</span>, <span class="charliteral">'g'</span>, <span class="charliteral">'h'</span>, <span class="charliteral">'i'</span>, <span class="charliteral">'j'</span>, <span class="charliteral">'k'</span>, <span class="charliteral">'l'</span>, <span class="charliteral">'m'</span>,</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="charliteral">'n'</span>, <span class="charliteral">'o'</span>, <span class="charliteral">'p'</span>, <span class="charliteral">'q'</span>, <span class="charliteral">'r'</span>, <span class="charliteral">'s'</span>, <span class="charliteral">'t'</span>, <span class="charliteral">'u'</span>, <span class="charliteral">'v'</span>, <span class="charliteral">'w'</span>, <span class="charliteral">'x'</span>, <span class="charliteral">'y'</span>, <span class="charliteral">'z'</span>,</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="charliteral">'0'</span>, <span class="charliteral">'1'</span>, <span class="charliteral">'2'</span>, <span class="charliteral">'3'</span>, <span class="charliteral">'4'</span>, <span class="charliteral">'5'</span>, <span class="charliteral">'6'</span>, <span class="charliteral">'7'</span>, <span class="charliteral">'8'</span>, <span class="charliteral">'9'</span>, <span class="charliteral">'+'</span>, <span class="charliteral">'/'</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  };</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  uint8_t result = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <span class="keywordtype">size_t</span> line_begin = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  {</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="comment">// step 0: if the string is finished here, no padding is needed</span></div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">if</span> (in == in_end) {</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  }</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span> </div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="comment">// step 0: process first byte, write first letter</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  uint8_t fragment = *in++;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  result = (fragment & 0xFC) >> 2;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  out += encoding64[result];</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  result = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>((fragment & 0x03) << 4);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <span class="comment">// step 1: if string finished here, add two padding '='s</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keywordflow">if</span> (in == in_end) {</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  out += encoding64[result];</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  out += <span class="charliteral">'='</span>;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  out += <span class="charliteral">'='</span>;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="comment">// step 1: process second byte together with first, write second</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="comment">// letter</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  fragment = *in++;</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  result |= (fragment & 0xF0) >> 4;</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  out += encoding64[result];</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  result = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>((fragment & 0x0F) << 2);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="comment">// step 2: if string finished here, add one padding '='</span></div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">if</span> (in == in_end) {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  out += encoding64[result];</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  out += <span class="charliteral">'='</span>;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  }</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> </div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="comment">// step 2: process third byte and write third and fourth letters.</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  fragment = *in++;</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  result |= (fragment & 0xC0) >> 6;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  out += encoding64[result];</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  result = (fragment & 0x3F) >> 0;</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  out += encoding64[result];</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> </div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="comment">// wrap base64 encoding into lines if desired, but only after whole</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="comment">// blocks of 4 letters.</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">if</span> (line_break > 0 && out.size() - line_begin >= line_break)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  out += <span class="charliteral">'\n'</span>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  line_begin = out.size();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  }</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> }</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="group__tlx__string.html#ga16a12f591febaeddffd2ffca031c8bf4"> 102</a></span> std::string <a class="code" href="group__tlx__string.html#ga691477f59c8496eec65e994ce3f6e6e5">base64_encode</a>(<span class="keyword">const</span> std::string& str, <span class="keywordtype">size_t</span> line_break) {</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">return</span> <a class="code" href="group__tlx__string.html#ga691477f59c8496eec65e994ce3f6e6e5">base64_encode</a>(str.data(), str.size(), line_break);</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="comment">/******************************************************************************/</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="group__tlx__string.html#gac2775fbea220f27325aba0f8af1cc9a8"> 108</a></span> std::string <a class="code" href="group__tlx__string.html#gac2775fbea220f27325aba0f8af1cc9a8">base64_decode</a>(<span class="keyword">const</span> <span class="keywordtype">void</span>* data, <span class="keywordtype">size_t</span> size, <span class="keywordtype">bool</span> strict) {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keyword">const</span> uint8_t* in = <span class="keyword">reinterpret_cast<</span><span class="keyword">const </span>uint8_t*<span class="keyword">></span>(data);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keyword">const</span> uint8_t* in_end = in + size;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  std::string out;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="comment">// estimate the output size, assume that the whole input string is</span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="comment">// base64 encoded.</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  out.reserve(size * 3 / 4);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> </div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keyword">static</span> constexpr uint8_t ex = 255;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keyword">static</span> constexpr uint8_t ws = 254;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="comment">// value lookup table: -1 -> exception, -2 -> skip whitespace</span></div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">static</span> <span class="keyword">const</span> uint8_t decoding64[256] = {</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ws, ws, ex, ex, ws, ex, ex,</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  ws, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, 62, ex, ex, ex, 63,</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, ex, ex, ex, ws, ex, ex,</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  ex, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  ex, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex,</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex, ex</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  };</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  uint8_t outchar, fragment;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* ex_message =</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="stringliteral">"Invalid character encountered during base64 decoding."</span>;</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  {</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="comment">// step 0: save first valid letter. do not output a byte, yet.</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keywordflow">if</span> (in == in_end) <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  fragment = decoding64[*in++];</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">if</span> (fragment == ex && strict)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">throw</span> std::runtime_error(ex_message);</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  } <span class="keywordflow">while</span> (fragment >= ws);</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>((fragment & 0x3F) << 2);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// step 1: get second valid letter. output the first byte.</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">if</span> (in == in_end) <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  fragment = decoding64[*in++];</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">if</span> (fragment == ex && strict)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <span class="keywordflow">throw</span> std::runtime_error(ex_message);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  } <span class="keywordflow">while</span> (fragment >= ws);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>(outchar | ((fragment & 0x30) >> 4));</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  out += <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>(outchar);</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> </div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>((fragment & 0x0F) << 4);</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> </div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="comment">// step 2: get third valid letter. output the second byte.</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">if</span> (in == in_end) <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> </div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  fragment = decoding64[*in++];</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keywordflow">if</span> (fragment == ex && strict)</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">throw</span> std::runtime_error(ex_message);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  } <span class="keywordflow">while</span> (fragment >= ws);</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> </div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>(outchar | ((fragment & 0x3C) >> 2));</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  out += <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>(outchar);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>((fragment & 0x03) << 6);</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="comment">// step 3: get fourth valid letter. output the third byte.</span></div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordflow">do</span> {</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">if</span> (in == in_end) <span class="keywordflow">return</span> out;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  fragment = decoding64[*in++];</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">if</span> (fragment == ex && strict)</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">throw</span> std::runtime_error(ex_message);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  } <span class="keywordflow">while</span> (fragment >= ws);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> </div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  outchar = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>(outchar | ((fragment & 0x3F) >> 0));</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  out += <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>(outchar);</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  }</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"><a class="line" href="group__tlx__string.html#gabe1e973cd3a2d5b7e55544d4c616da49"> 203</a></span> std::string <a class="code" href="group__tlx__string.html#gac2775fbea220f27325aba0f8af1cc9a8">base64_decode</a>(<span class="keyword">const</span> std::string& str, <span class="keywordtype">bool</span> strict) {</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">return</span> <a class="code" href="group__tlx__string.html#gac2775fbea220f27325aba0f8af1cc9a8">base64_decode</a>(str.data(), str.size(), strict);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> }</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> } <span class="comment">// namespace tlx</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="comment">/******************************************************************************/</span></div><div class="ttc" id="group__tlx__string_html_gac2775fbea220f27325aba0f8af1cc9a8"><div class="ttname"><a href="group__tlx__string.html#gac2775fbea220f27325aba0f8af1cc9a8">tlx::base64_decode</a></div><div class="ttdeci">std::string base64_decode(const void *data, size_t size, bool strict)</div><div class="ttdoc">Decode a string in base64 representation as described in RFC 2045 or RFC 3548 and return the original...</div><div class="ttdef"><b>Definition:</b> <a href="base64_8cpp_source.html#l00108">base64.cpp:108</a></div></div>
<div class="ttc" id="base64_8hpp_html"><div class="ttname"><a href="base64_8hpp.html">base64.hpp</a></div></div>
<div class="ttc" id="namespacetlx_html"><div class="ttname"><a href="namespacetlx.html">tlx</a></div><div class="ttdef"><b>Definition:</b> <a href="exclusive__scan_8hpp_source.html#l00017">exclusive_scan.hpp:17</a></div></div>
<div class="ttc" id="group__tlx__string_html_ga691477f59c8496eec65e994ce3f6e6e5"><div class="ttname"><a href="group__tlx__string.html#ga691477f59c8496eec65e994ce3f6e6e5">tlx::base64_encode</a></div><div class="ttdeci">std::string base64_encode(const void *data, size_t size, size_t line_break)</div><div class="ttdoc">Encode the given binary data into base64 representation as described in RFC 2045 or RFC 3548...</div><div class="ttdef"><b>Definition:</b> <a href="base64_8cpp_source.html#l00025">base64.cpp:25</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_8b4d4685f7eaf29e53aad23645930303.html">tlx</a></li><li class="navelem"><a class="el" href="dir_45a7f11e1a4af18f182d54b603484851.html">string</a></li><li class="navelem"><a class="el" href="base64_8cpp.html">base64.cpp</a></li>
<li class="footer">Generated on Sat Oct 2 2021 20:29:00 for tlx by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>