C++如何将mp3/avi/png/pdf/xls等任意文件转换为字符串用于加解密
任意类型文件转字符串的通用C++实现方案
存在完全通用的实现方式,和原文件的格式、类型无关,核心逻辑是对文件的原始二进制字节做无损转换,完全可以满足后续加解密的需求。
核心实现思路
任意文件本质都是二进制字节的集合,转换为字符串有两种可选方案,你可以根据后续加解密算法的特性选择:
- 方案1(无编码转换,最高效):直接将文件二进制字节存入
std::string容器,适合你的加解密算法本身支持处理原始字节序列的场景 - 方案2(Base64编码转换,兼容性最好):将二进制字节编码为全可打印的Base64字符串,适合加解密算法要求输入为可打印字符串、或者需要把转换结果在文本协议中传输的场景
具体代码实现
1. 通用读取任意文件为二进制字节
#include <fstream> #include <vector> #include <string> // 读取任意文件为二进制字节数组 std::vector<uint8_t> read_file_to_bytes(const std::string& file_path) { std::ifstream file(file_path, std::ios::binary | std::ios::ate); if (!file.is_open()) { return {}; // 读取失败处理,可根据需求加异常抛出 } std::streamsize file_size = file.tellg(); file.seekg(0, std::ios::beg); std::vector<uint8_t> buffer(file_size); if (!file.read(reinterpret_cast<char*>(buffer.data()), file_size)) { return {}; } return buffer; }
2. 方案1:直接转std::string(无编码)
std::vector<uint8_t> file_bytes = read_file_to_bytes("test.mp3"); // 直接构造std::string,内部存储原始二进制字节 std::string raw_byte_str(file_bytes.begin(), file_bytes.end()); /* 注意事项: 1. 该字符串内部可能包含'\0'、不可见控制字符,不要调用c_str()做字符串操作,否则会被截断 2. 加解密处理时要按字符串的size()方法获取实际长度,不要依赖字符串结束符 */
3. 方案2:转Base64编码字符串(兼容性最优)
你可以自己实现简单的Base64编码逻辑,或者使用C++17及以上标准库的对应接口,轻量实现示例如下:
// Base64编码表 const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; std::string base64_encode(const std::vector<uint8_t>& bytes) { std::string ret; int i = 0; int j = 0; uint8_t char_array_3[3]; uint8_t char_array_4[4]; int bytes_len = bytes.size(); while (bytes_len--) { char_array_3[i++] = bytes[j++]; 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; } } 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::vector<uint8_t> file_bytes = read_file_to_bytes("test.pdf"); std::string base64_str = base64_encode(file_bytes);
注意事项
- 不要尝试用UTF-8、GBK等文本编码解析二进制文件字节生成字符串,会出现字节丢失、乱码,无法还原为原文件
- 解密后如果要还原原文件,只需要把字符串反向操作:如果用了Base64就先解码回二进制字节,再把字节写入文件即可,和原文件完全一致无损失
- 如果你的加解密算法只需要处理字节序列,优先选择方案1,没有额外的体积开销,性能更高
内容的提问来源于stack exchange,提问作者StayAlone
相关产品推荐
相关产品推荐

