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

C++如何将文件存储的十六进制内存值直接写入内存恢复原变量

问题原因

你当前的解码逻辑错误是直接将十六进制字符串的ASCII编码内容拷贝到了目标内存,没有完成「十六进制文本→原始二进制字节」的转换。例如文本中的7b是两个ASCII字符(对应ASCII值0x37和0x62),你需要先把它转换成对应的二进制值0x7b再写入内存。

正确实现方案

解码函数代码

#include <string>
#include <sstream>
#include <fstream>
#include <cstdint>

template<typename T>
void decode(T* ptr, std::ifstream& file) {
    std::string line;
    std::getline(file, line);
    std::istringstream iss(line);
    std::string hex_byte;
    uint8_t* dst = reinterpret_cast<uint8_t*>(ptr);
    size_t byte_cnt = 0;
    const size_t max_byte = sizeof(T);

    // 按空格分割逐个读取十六进制字节串,自动跳过空格、换行等空白符
    while (iss >> hex_byte && byte_cnt < max_byte) {
        // 将2位十六进制字符串转换为对应的二进制字节值
        uint8_t val = static_cast<uint8_t>(std::stoul(hex_byte, nullptr, 16));
        dst[byte_cnt++] = val;
    }
}

注意事项

  • 该序列化/反序列化方案仅适用于POD类型(普通旧数据类型,无自定义构造函数、虚函数、指针成员、非POD成员等),非POD类型直接拷贝内存会触发未定义行为
  • 编码和解码必须在相同字节序的平台上执行,如果需要跨平台传输,需要额外做字节序统一转换处理
  • 编码时建议每序列化一个对象就写入一行换行符,解码时按行读取可以避免多个对象的十六进制串混在一起

内容的提问来源于stack exchange,提问作者J.Meulenbeld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:06:09