0

0

C++如何快速将二进制文件转换为Base64编码?(数据传输)

尼克

尼克

发布时间:2026-03-09 14:11:03

|

910人浏览过

|

来源于php中文网

原创

c++标准库无std::base64encode,需用boost.beast头文件实现、openssl或手写rfc 4648兼容代码;务必二进制模式读文件、正确处理填充符和缓冲区长度。

c++如何快速将二进制文件转换为base64编码?(数据传输)

std::base64encode?C++标准库里根本没有这个函数

别浪费时间搜 std::base64encode —— C++20 和 C++23 都没把它加进标准库。你看到的所谓“标准实现”基本是编译器扩展或误传。真要跑起来,得靠第三方库或手写轻量编码逻辑。

最现实的选择是:用 boost::beast::detail::base64(零依赖、头文件-only)、opensslEVP_EncodeBlock,或者抄一段 50 行以内的成熟 base64 编码函数(RFC 4648 兼容)。

  • Boost.Beast 的 boost/beast/core/detail/base64.hpp 不需要链接,只 include 就行,适合嵌入式或构建受限环境
  • OpenSSL 方案性能好、经得起压测,但得链接 -lcrypto,部署时多一个动态库依赖
  • 手写实现要注意:输入长度不是 3 的倍数时,末尾要补 =;字节序无关,但读文件必须用 std::ios::binary

读二进制文件时忘记 std::ios::binary,Base64 结果就全错

Windows 下尤其明显:不加 binary 模式,\r\n 会被悄悄转成 \n,原始字节流被污染,Base64 输出和预期对不上,且无法反解。

正确做法是直接把文件读进 std::vector<:byte></:byte>std::string(用 unsigned char 构造),避免中间编码转换:

Midjourney
Midjourney

当前最火的AI绘图生成工具,可以根据文本提示生成华丽的视觉图片。

下载

立即学习C++免费学习笔记(深入)”;

std::ifstream file("data.bin", std::ios::in | std::ios::binary);
file.seekg(0, std::ios::end);
size_t size = file.tellg();
file.seekg(0);
std::vector<std::byte> buf(size);
file.read(reinterpret_cast<char*>(buf.data()), size);
  • 别用 std::string 存二进制数据再调 .c_str() —— C++11 后 std::string 保证连续内存,但语义上它仍是文本容器,容易引发误操作
  • 读大文件时别一次性 load:如果只是传输,可边读边 encode(分块 feed 给 base64 编码器),减少峰值内存
  • file.gcount() 一定要检查,特别是网络文件系统或 NFS 挂载点,可能 read 不完整

Base64 编码后字符串末尾的 = 能不能去掉?看接收方

可以去,但不是“建议去掉”。= 是填充符,用于对齐长度(每 4 个 Base64 字符对应 3 个原始字节)。去掉后体积小一点,但很多接收端(比如某些 JSON API、旧版 Java Base64.getDecoder())会直接报 IllegalArgumentException: Illegal base64 character

  • HTTP 传输或 URL 场景用 base64url(RFC 4648 §5):把 +-/_,省略 = —— 但这是另一套编码,不能和标准 Base64 混用
  • 如果你控制两端,且确认接收方支持无填充格式,可以用 boost::beast::detail::base64::encodepad = false 参数
  • 别自己用 .erase() 删掉末尾 =:有些实现会在中间插入换行(如 MIME),删错了会破坏整个串

为什么 OpenSSL 的 EVP_EncodeBlock 返回值比预期少 1 字节?

因为 EVP_EncodeBlock 不写结尾的 \0 —— 它只写编码后的字符,长度严格等于 4 * ((len + 2) / 3)。你如果用 std::string(encoded, len) 初始化,却传了 sizeof(encoded) 或多算 1,就会把栈上/堆上的脏字节也包进去,导致解码失败或崩溃。

  • 正确方式:int out_len = EVP_EncodeBlock(dst, src, src_len);,然后用 std::string(dst, out_len)
  • 注意 dst 缓冲区大小至少为 4 * ((src_len + 2) / 3) + 1(+1 是防越界,虽然 EVP_EncodeBlock 不写 \0,但你后续可能当 C 字符串用)
  • 别用 EVP_EncodeUpdate + EVP_EncodeFinal 处理单次小文件——它们为流式设计,有额外状态开销,还容易忘调 Final

实际用的时候,最省心的是 Boost.Beast 的头文件实现;但如果项目已链 OpenSSL,直接复用它更稳妥。填充符、二进制读取模式、缓冲区长度计算——这三个点只要错一个,Base64 就不可逆。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

454

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

333

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

739

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

220

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Rust 教程
Rust 教程

共28课时 | 6.7万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号