You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:24:04