Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F92840755
base64.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Nov 24, 03:31
Size
4 KB
Mime Type
text/x-c
Expires
Tue, Nov 26, 03:31 (1 d, 22 h)
Engine
blob
Format
Raw Data
Handle
22524717
Attached To
rMUSPECTRE µSpectre
base64.h
View Options
This document is not UTF8. It was detected as ISO-8859-1 (Latin 1) and converted to UTF8 for display.
/*
base64.cpp and base64.h
base64 encoding and decoding with C++.
Version: 1.10 (1.01.00 modified by Martin Doskar)
- Changed to header-only
- Added namespace base64
- Added encode_vector_into_base64_string function template
Copyright (C) 2004-2017 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#ifndef BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A
#define BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
namespace
base64
{
static
const
std
::
string
base64_chars
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"
;
static
inline
bool
is_base64
(
unsigned
char
c
)
{
return
(
isalnum
(
c
)
||
(
c
==
'+'
)
||
(
c
==
'/'
));
}
std
::
string
base64_encode
(
unsigned
char
const
*
bytes_to_encode
,
unsigned
int
in_len
)
{
std
::
string
ret
;
int
i
=
0
;
int
j
=
0
;
unsigned
char
char_array_3
[
3
];
unsigned
char
char_array_4
[
4
];
while
(
in_len
--
)
{
char_array_3
[
i
++
]
=
*
(
bytes_to_encode
++
);
if
(
i
==
3
)
{
char_array_4
[
0
]
=
(
char_array_3
[
0
]
&
0xfc
)
>>
2
;
char_array_4
[
1
]
=
((
char_array_3
[
0
]
&
0x03
)
<<
4
)
+
((
char_array_3
[
1
]
&
0xf0
)
>>
4
);
char_array_4
[
2
]
=
((
char_array_3
[
1
]
&
0x0f
)
<<
2
)
+
((
char_array_3
[
2
]
&
0xc0
)
>>
6
);
char_array_4
[
3
]
=
char_array_3
[
2
]
&
0x3f
;
for
(
i
=
0
;
(
i
<
4
);
i
++
)
ret
+=
base64_chars
[
char_array_4
[
i
]];
i
=
0
;
}
}
if
(
i
)
{
for
(
j
=
i
;
j
<
3
;
j
++
)
char_array_3
[
j
]
=
'\0'
;
char_array_4
[
0
]
=
(
char_array_3
[
0
]
&
0xfc
)
>>
2
;
char_array_4
[
1
]
=
((
char_array_3
[
0
]
&
0x03
)
<<
4
)
+
((
char_array_3
[
1
]
&
0xf0
)
>>
4
);
char_array_4
[
2
]
=
((
char_array_3
[
1
]
&
0x0f
)
<<
2
)
+
((
char_array_3
[
2
]
&
0xc0
)
>>
6
);
for
(
j
=
0
;
(
j
<
i
+
1
);
j
++
)
ret
+=
base64_chars
[
char_array_4
[
j
]];
while
((
i
++
<
3
))
ret
+=
'='
;
}
return
ret
;
}
template
<
typename
T
,
typename
=
std
::
enable_if_t
<
std
::
is_arithmetic
<
T
>::
value
>>
std
::
string
encode_vector_into_base64_string
(
std
::
vector
<
T
>&
dataVector
)
{
return
base64
::
base64_encode
(
reinterpret_cast
<
unsigned
char
const
*>
(
dataVector
.
data
()),
dataVector
.
size
()
*
(
sizeof
(
T
)
/
sizeof
(
unsigned
char
)));
}
std
::
string
base64_decode
(
std
::
string
const
&
encoded_string
)
{
int
in_len
=
encoded_string
.
size
();
int
i
=
0
;
int
j
=
0
;
int
in_
=
0
;
unsigned
char
char_array_4
[
4
],
char_array_3
[
3
];
std
::
string
ret
;
while
(
in_len
--
&&
(
encoded_string
[
in_
]
!=
'='
)
&&
is_base64
(
encoded_string
[
in_
]))
{
char_array_4
[
i
++
]
=
encoded_string
[
in_
];
in_
++
;
if
(
i
==
4
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
char_array_4
[
i
]
=
base64_chars
.
find
(
char_array_4
[
i
]);
char_array_3
[
0
]
=
(
char_array_4
[
0
]
<<
2
)
+
((
char_array_4
[
1
]
&
0x30
)
>>
4
);
char_array_3
[
1
]
=
((
char_array_4
[
1
]
&
0xf
)
<<
4
)
+
((
char_array_4
[
2
]
&
0x3c
)
>>
2
);
char_array_3
[
2
]
=
((
char_array_4
[
2
]
&
0x3
)
<<
6
)
+
char_array_4
[
3
];
for
(
i
=
0
;
(
i
<
3
);
i
++
)
ret
+=
char_array_3
[
i
];
i
=
0
;
}
}
if
(
i
)
{
for
(
j
=
0
;
j
<
i
;
j
++
)
char_array_4
[
j
]
=
base64_chars
.
find
(
char_array_4
[
j
]);
char_array_3
[
0
]
=
(
char_array_4
[
0
]
<<
2
)
+
((
char_array_4
[
1
]
&
0x30
)
>>
4
);
char_array_3
[
1
]
=
((
char_array_4
[
1
]
&
0xf
)
<<
4
)
+
((
char_array_4
[
2
]
&
0x3c
)
>>
2
);
for
(
j
=
0
;
(
j
<
i
-
1
);
j
++
)
ret
+=
char_array_3
[
j
];
}
return
ret
;
}
}
#endif
/* BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A */
Event Timeline
Log In to Comment