#include "crypto/encode/base64.h"

static const std::string base64_chars =
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    "0123456789+/";static inline bool is_base64(unsigned charc)
{
return (isalnum(c) || (c == '+') || (c == '/'));
}

std::
string Base64::Encode(const std::string&src)
{
std::
stringret;
unsigned
char char_array_3[3];
unsigned
char char_array_4[4];

size_t srcLen
=src.length();const char* pSrc =src.c_str();

size_t i
= 0;while (srcLen--) {
char_array_3[i
++] = *(pSrc++);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;
}
}

size_t j
= 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);
char_array_4[
3] = char_array_3[2] & 0x3f;for (j = 0; (j < i + 1); j++)
ret
+=base64_chars[char_array_4[j]];while ((i++ < 3))
ret
+= '=';

}
returnret;
}

std::
string Base64::Encode(const unsigned char*src, size_t dataLen)
{
if ((src == NULL) || (dataLen == 0))
{
return std::string();
}

std::
stringret;
unsigned
char char_array_3[3];
unsigned
char char_array_4[4];

size_t srcLen
=dataLen;const char* pSrc = reinterpret_cast<const char*>(src);

size_t i
= 0;while (srcLen--) {
char_array_3[i
++] = *(pSrc++);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;
}
}

size_t j
= 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);
char_array_4[
3] = char_array_3[2] & 0x3f;for (j = 0; (j < i + 1); j++)
ret
+=base64_chars[char_array_4[j]];while ((i++ < 3))
ret
+= '=';
}
returnret;
}
bool Base64::Decode(const std::string& src, std::string& out)
{
out.clear();

size_t in_len
=src.size();
size_t i
= 0;
size_t j
= 0;
size_t in_
= 0;
unsigned
char char_array_4[4], char_array_3[3];while (in_len-- && (src[in_] != '=') &&is_base64(src[in_])) {
char_array_4[i
++] = src[in_]; in_++;if (i == 4) {for (i = 0; i <4; i++)
char_array_4[i]
= (unsigned char)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++)out +=char_array_3[i];
i
= 0;
}
}
if(i) {for (j = i; j <4; j++)
char_array_4[j]
= 0;for (j = 0; j <4; j++)
char_array_4[j]
= (unsigned char)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);
char_array_3[
2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (j = 0; (j < i - 1); j++)out +=char_array_3[j];
}
return true;
}
bool Base64::Decode(const unsigned char* src, size_t srcLen, unsigned char* decoded, size_t&decoded_length)
{
if ((src == NULL) || (srcLen < 1))return false;if ((decoded == NULL) || (decoded_length < 1))return false;

size_t i
= 0;
size_t j
= 0;
size_t in_
= 0;
unsigned
char char_array_4[4];
unsigned
char char_array_3[3];

size_t offset
= 0;while (srcLen-- && (src[in_] != '=') &&is_base64(src[in_])) {
char_array_4[i
++] = src[in_]; in_++;if (i == 4) {for (i = 0; i <4; i++)
char_array_4[i]
= (unsigned char)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++)
{
if (offset <decoded_length)
decoded[offset
++] =char_array_3[i];else return false;
}
i
= 0;
}
}
if(i) {for (j = i; j <4; j++)
char_array_4[j]
= 0;for (j = 0; j <4; j++)
char_array_4[j]
= (unsigned char)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);
char_array_3[
2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (j = 0; (j < i - 1); j++)
{
if (offset <decoded_length)
decoded[offset
++] =char_array_3[j];else return false;
}
}

decoded_length
=offset;return true;
}
bool Base64::Decode(const unsigned char* src, size_t srcLen, std::vector<unsigned char>& out)
{
out.clear();

size_t i
= 0;
size_t j
= 0;
size_t in_
= 0;
unsigned
char char_array_4[4];
unsigned
char char_array_3[3];while (srcLen-- && (src[in_] != '=') &&is_base64(src[in_])) {
char_array_4[i
++] = src[in_]; in_++;if (i == 4) {for (i = 0; i <4; i++)
char_array_4[i]
= (unsigned char)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++)out.push_back(char_array_3[i]);
i
= 0;
}
}
if(i) {for (j = i; j <4; j++)
char_array_4[j]
= 0;for (j = 0; j <4; j++)
char_array_4[j]
= (unsigned char)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);
char_array_3[
2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (j = 0; (j < i - 1); j++)out.push_back(char_array_3[j]);
}
return true;
}

 

标签: none

添加新评论