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 135 136 137
| #pragma once #include <string> #include <vector> #include <cstdint> #include <stdexcept> #include <algorithm>
/** * @brief 标准Base64编码表(RFC4648) */ static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/";
/** * @brief Base64解码快速查找表(-1=非法字符,-2=填充符=) */ static const int8_t base64_decode_table[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, -1, 0, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
/** * @brief Base64编码函数(适配uint8_t/vector) * @param data 原始数据指针 * @param len 数据长度 * @return Base64编码后的字符串 */ static std::string base64Encode(const uint8_t* data, size_t len) { if (data == nullptr || len == 0) { return ""; }
std::string result; result.reserve(((len + 2) / 3) * 4); // 预分配内存,提升性能
for (size_t i = 0; i < len; i += 3) { // 取3个字节,不足补0 uint32_t triple = 0; size_t bytes = std::min<size_t>(3, len - i); for (size_t j = 0; j < bytes; ++j) { triple |= (static_cast<uint32_t>(data[i + j]) << (16 - 8 * j)); }
// 拆分为4个6位值,映射到Base64表 result += base64_table[(triple >> 18) & 0x3F]; result += base64_table[(triple >> 12) & 0x3F]; result += (bytes >= 2) ? base64_table[(triple >> 6) & 0x3F] : '='; result += (bytes >= 3) ? base64_table[triple & 0x3F] : '='; }
return result; }
/** * @brief Base64编码重载(适配vector<uint8_t>) * @param data 原始数据vector * @return Base64编码后的字符串 */ static std::string base64Encode(const std::vector<uint8_t>& data) { return base64Encode(data.data(), data.size()); }
/** * @brief Base64解码函数(与DLL中调用完全匹配) * @param encoded Base64编码字符串 * @return 解码后的原始数据(vector<unsigned char> 兼容) * @throw std::invalid_argument 编码字符串非法 */ static std::vector<uint8_t> base64Decode(const std::string& encoded) { if (encoded.empty()) { return {}; }
// 校验Base64字符串长度合法性 if (encoded.size() % 4 != 0) { throw std::invalid_argument("Base64解码失败:长度不是4的倍数"); }
// 计算填充符=的数量 size_t padding = 0; if (encoded.back() == '=') { padding++; if (encoded[encoded.size() - 2] == '=') { padding++; } }
std::vector<uint8_t> result; result.reserve(((encoded.size() / 4) * 3) - padding); // 预分配内存
for (size_t i = 0; i < encoded.size(); i += 4) { // 解析4个Base64字符为3个字节 uint32_t triple = 0; for (size_t j = 0; j < 4; ++j) { char c = encoded[i + j]; int8_t val = base64_decode_table[static_cast<uint8_t>(c)];
// 非法字符检查 if (val == -1) { throw std::invalid_argument("Base64解码失败:包含非法字符"); } // 填充符=处理为0 if (val == -2) { val = 0; }
triple |= (static_cast<uint32_t>(val) << (18 - 6 * j)); }
// 提取3个字节(不足则跳过) result.push_back(static_cast<uint8_t>((triple >> 16) & 0xFF)); if (i + 2 < encoded.size() && encoded[i + 2] != '=') { result.push_back(static_cast<uint8_t>((triple >> 8) & 0xFF)); } if (i + 3 < encoded.size() && encoded[i + 3] != '=') { result.push_back(static_cast<uint8_t>(triple & 0xFF)); } }
return result; }
|