Base64 编码解码在 C++ 中无标准库支持,但可使用纯 C++ 实现:编码将每 3 字节转为 4 字符(A–z、0–9、+、/),用 '=' 填充;解码严格校验长度、填充及字符合法性,并支持含空字节和中文的任意二进制数据。

Base64 编码和解码在 C++ 中没有标准库直接支持,但可以用简洁、安全的纯 C++ 实现(无需外部依赖)。下面是一个轻量、跨平台、符合 RFC 4648 的实现,支持任意二进制数据(含空字节、中文等),并附带完整可运行示例。
Base64 将每 3 字节(24 位)原始数据拆成 4 组 6 位,映射为 64 个可打印 ASCII 字符(A–Z, a–z, 0–9, +, /),末尾用 '=' 补齐。标准字符表固定,不可随意替换:
以下函数接受 std::string
(可含 '\0'),返回编码后的字符串:
#include <string>
#include <vector>
<p>static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";</p><p>std::string base64_encode(const std::string& input) {
std::string output;
output.reserve(((input.length() + 2) / 3) * 4); // 预分配空间</p><pre class='brush:php;toolbar:false;'>size_t i = 0;
while (i < input.length()) {
unsigned char b0 = input[i++];
unsigned char b1 = (i < input.length()) ? input[i++] : 0;
unsigned char b2 = (i < input.length()) ? input[i++] : 0;
unsigned char p0 = b0 >> 2;
unsigned char p1 = ((b0 & 0x03) << 4) | (b1 >> 4);
unsigned char p2 = ((b1 & 0x0f) << 2) | (b2 >> 6);
unsigned char p3 = b2 & 0x3f;
output.push_back(base64_chars[p0]);
output.push_back(base64_chars[p1]);
output.push_back((i > input.length() - 2) ? '=' : base64_chars[p2]);
output.push_back((i > input.length() - 1) ? '=' : base64_chars[p3]);
}
return output;}
解码时需处理 '=' 填充、非法字符和长度校验。该版本会抛出 std::invalid_argument 异常(可按需改为返回空字符串):
《PHP设计模式指南》中文版
《PHP设计模式》首先介绍了设计模式,讲述了设计模式的使用及重要性,并且详细说明了应用设计模式的场合。接下来,本书通过代码示例介绍了许多设计模式。最后,本书通过全面深入的案例分析说明了如何使用设计模式来计划新的应用程序,如何采用PHP语言编写这些模式,以及如何使用书中介绍的设计模式修正和重构已有的代码块。作者采用专业的、便于使用的格式来介绍相关的概念,自学成才的编程人员与经过更多正规培训的编程人员
341
查看详情
#include <stdexcept>
#include <cctype>
<p>std::string base64_decode(const std::string& input) {
// 忽略空白符(如换行、空格),但不自动跳过非法字符
std::string clean;
for (char c : input)
if (!std::isspace(static_cast<unsigned char>(c))) clean += c;</p><pre class='brush:php;toolbar:false;'>if (clean.empty()) return {};
size_t len = clean.length();
if (len % 4 != 0) throw std::invalid_argument("Base64 string length not multiple of 4");
// 检查结尾填充是否合法:最多两个 '=',且必须在末尾
size_t pad = 0;
if (len >= 2 && clean[len-1] == '=') pad++;
if (len >= 2 && clean[len-2] == '=') pad++;
std::string output;
output.reserve((len * 3) / 4 - pad);
std::vector<int> lookup(256, -1);
for (size_t i = 0; i < base64_chars.length(); ++i)
lookup[static_cast<unsigned char>(base64_chars[i])] = static_cast<int>(i);
for (size_t i = 0; i < len; i += 4) {
int p0 = lookup[static_cast<unsigned char>(clean[i])];
int p1 = lookup[static_cast<unsigned char>(clean[i+1])];
int p2 = (i + 2 < len && clean[i+2] != '=') ? lookup[static_cast<unsigned char>(clean[i+2])] : 0;
int p3 = (i + 3 < len && clean[i+3] != '=') ? lookup[static_cast<unsigned char>(clean[i+3])] : 0;
if (p0 == -1 || p1 == -1 || (i+2 < len && clean[i+2] != '=' && p2 == -1) ||
(i+3 < len && clean[i+3] != '=' && p3 == -1))
throw std::invalid_argument("Invalid Base64 character");
unsigned char b0 = (p0 << 2) | (p1 >> 4);
unsigned char b1 = ((p1 & 0x0f) << 4) | (p2 >> 2);
unsigned char b2 = ((p2 & 0x03) << 6) | p3;
output.push_back(b0);
if (i + 2 < len && clean[i+2] != '=') output.push_back(b1);
if (i + 3 < len && clean[i+3] != '=') output.push_back(b2);
}
return output;}
验证编码/解码一致性,支持 UTF-8 字符串和任意二进制数据:
#include <iostream>
#include <cassert>
<p>int main() {
// 示例1:普通字符串
std::string s1 = "Hello, 世界";
std::string enc1 = base64_encode(s1);
std::string dec1 = base64_decode(enc1);
assert(dec1 == s1);
std::cout << "Text: " << enc1 << "\n"; // SGVsbG8sIOS4lueVjA==</p><pre class='brush:php;toolbar:false;'>// 示例2:含空字节的二进制数据
std::string bin = "ABC\0XYZ";
std::string enc2 = base64_encode(bin);
std::string dec2 = base64_decode(enc2);
assert(dec2 == bin);
std::cout << "Binary len: " << enc2 << " (" << dec2.length() << " bytes)\n";
return 0;}
基本上就这些。代码无第三方依赖,兼容 C++11 及以上,可直接复制使用。注意:生产环境若需更高性能或更严格式(如 URL 安全变体),可考虑 boost::beast::detail::base64 或 OpenSSL EVP,但对大多数场景,上述实现已足够清晰、可靠、易维护。
以上就是C++如何进行Base64编码和解码?(代码示例)的详细内容,更多请关注其它相关文章!
# 如何实现
# 大数据垂直网站 推广
# 贵州关键词排名有效果吗
# 龙华怎么做网站推广
# 深圳讯美网站建设
# 佛山搜狗seo报价
# 门户网站建设哪家好
# SEO北京拍照圣地
# 贷款中介seo获客方案
# 宁夏农业技术推广网站
# 陕西seo外包软件排名
# 自学成才
# 是一个
# 返回值
# 编码
# 尼克
# 说明了
# 多个
# 本书
# 二进制数
# 如何使用
# 标准库
# stream
# ios
# c++
# ai
# ssl
# 字节
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
b站网页版入口 哔哩哔哩官方网站直接进入
《东方财富》条件单关闭方法
《海贝音乐》均衡器设置方法
cad加载的线型看不见怎么办_cad线型不可见问题解决方法
邦丰播放器频道搜索设置
教资成绩怎么查询
韩剧圈正版官网入口_韩剧圈官方指定登录
邮编号码查询app有哪些_邮编号码查询推荐app及使用体验
J*aScript大数运算_BigInt使用指南
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
圆通快递官网入口查询单号 手机版官方查询入口
抖音视频如何添加标题?添加标题有哪些好处?
Vue 3中独立响应式实例的创建与应用
嘴唇干裂起皮怎么办 唇部护理与预防干裂的方法【详解】
如何外贸网站设计-能留住客户提升用户体验!
rabbitmq 持久化有什么缺点?
MacBook Pro词典使用指南
mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
我的世界游戏平台入口 我的世界官方官网直达链接
三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧
企查查官网和爱企查 企查查企业查询官网入口
composer licenses 命令:如何检查项目依赖的许可证?
Python中深度嵌套字典与列表的数据提取与条件过滤指南
使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留
管理打开的编辑器:固定、分组和关闭技巧
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
在VS Code中利用AI辅助进行代码迁移
《顺丰同城骑士》查看我的技能方法
第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项
高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法
抖音号升级企业号怎么改名字?升级企业号有哪些好处?
使用AI在VS Code中将代码从一种语言翻译成另一种
FullCalendar自定义按钮样式定制指南
附近酒吧怎么找?
谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录
如何测试您的网站全球打开速度-网站海外测速工
键盘测试软件哪个好_键盘故障检测工具推荐
《宝可梦大集结》S4冠军之路开始时间介绍
byrutor直接访问入口 byrutor官方游戏库
电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法
汽水音乐车机版 汽水音乐车机版官方入口
抖音猜你想搜能说明对方搜过吗
B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】
电脑视频号|直播|如何分享屏幕
《土豆雅思》修改密码方法
京东快递物流信息不更新怎么办_物流停滞原因与处理方法
《i莞家》修改昵称方法
荣耀盒子应用管理技巧
微信客户端如何找回密码_微信客户端忘记密码找回方法
2025-12-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。