| #include "crypto/encode/base64.h" |
| |
| 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(const std::string& src) |
| { |
| std::string ret; |
| 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 += '='; |
| |
| } |
| |
| return ret; |
| } |
| |
| std::string Base64::Encode(const unsigned char* src, size_t dataLen) |
| { |
| if ((src == NULL) || (dataLen == 0)) |
| { |
| return std::string(); |
| } |
| |
| std::string ret; |
| 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 += '='; |
| } |
| |
| return ret; |
| } |
| |
| 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; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人