如何将float、double转二进制存入uint8_t vector及反序列化还原原值?
实现float/double与uint8_t vector的序列化和反序列化
完全可行,核心思路是直接操作变量的内存字节——因为float(通常4字节)和double(通常8字节)在内存中是以固定二进制格式存储的,我们可以直接把这些字节拷贝到vector<uint8_t>中,反序列化时再把字节拷贝回对应类型的变量。
序列化实现
通过类型转换获取变量的字节指针,将字节批量存入vector:
#include <vector> #include <cstring> void serialize_float(float val, std::vector<uint8_t>& data) { const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&val); data.insert(data.end(), bytes, bytes + sizeof(float)); } void serialize_double(double val, std::vector<uint8_t>& data) { const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&val); data.insert(data.end(), bytes, bytes + sizeof(double)); } // 使用示例 int main() { float x = 23.22; double z = 2.32232; std::vector<uint8_t> data; serialize_float(x, data); serialize_double(z, data); // 此时data中包含x的4个字节 + z的8个字节 return 0; }
反序列化实现
从vector中取出对应长度的字节,拷贝回目标变量:
// 反序列化前需确保vector有足够字节,且偏移位置正确 bool deserialize_float(const std::vector<uint8_t>& data, size_t& offset, float& out_val) { if (offset + sizeof(float) > data.size()) { return false; // 字节不足,反序列化失败 } std::memcpy(&out_val, &data[offset], sizeof(float)); offset += sizeof(float); return true; } bool deserialize_double(const std::vector<uint8_t>& data, size_t& offset, double& out_val) { if (offset + sizeof(double) > data.size()) { return false; } std::memcpy(&out_val, &data[offset], sizeof(double)); offset += sizeof(double); return true; } // 使用示例 int main() { std::vector<uint8_t> data; // 假设data已填充序列化后的字节 size_t offset = 0; float x; double z; if (deserialize_float(data, offset, x) && deserialize_double(data, offset, z)) { // 成功还原原始值 } return 0; }
关键注意点
- 字节序兼容性:如果序列化和反序列化在不同架构设备(如x86小端、嵌入式大端)执行,需要额外做字节序转换,保证两端存储格式一致。
- 类型大小适配:始终用
sizeof(float)和sizeof(double)代替硬编码的4/8,避免因平台差异导致的错误。 - 内存安全校验:反序列化必须检查剩余字节是否足够,防止越界访问。
内容的提问来源于stack exchange,提问作者Sao Petrik
相关产品推荐
相关产品推荐

