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
相关产品推荐
相关产品推荐

