base64编解码的另外几个版本
#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;
unsignedchar char_array_3[3];
unsignedchar 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;
unsignedchar char_array_3[3];
unsignedchar 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;
unsignedchar 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;
unsignedchar char_array_4[4];
unsignedchar 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;
unsignedchar char_array_4[4];
unsignedchar 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;
}