C++ 以独立于平台的方式将值序列化为字节字符串

C++ 以独立于平台的方式将值序列化为字节字符串,c++,C++,我正在编写一些序列化代码,这些代码的工作级别比我习惯的要低。我需要函数来获取各种值类型(int32\u t,int64\u t,float,等等),并将它们放入向量中,为写入文件做准备。该文件将以类似的方式读取和重建 要写入向量的函数如下所示: void write_int32(std::vector<unsigned char>& buffer, int32_t value) { buffer.push_back((value >> 24) &

我正在编写一些序列化代码,这些代码的工作级别比我习惯的要低。我需要函数来获取各种值类型(
int32\u t
int64\u t
float
,等等),并将它们放入
向量中,为写入文件做准备。该文件将以类似的方式读取和重建

要写入向量的函数如下所示:

void write_int32(std::vector<unsigned char>& buffer, int32_t value)
{
    buffer.push_back((value >> 24) & 0xff);
    buffer.push_back((value >> 16) & 0xff);
    buffer.push_back((value >> 8) & 0xff);
    buffer.push_back(value & 0xff);
}

void write_float(std::vector<unsigned char>& buffer, float value)
{
    assert(sizeof(float) == sizeof(int32_t));

    write_int32(buffer, *(int32_t *)&value);
}
void write_int32(标准::向量和缓冲区,int32_t值)
{
缓冲区。推回((值>>24)和0xff);
buffer.push_back((值>>16)和0xff);
buffer.push_back((值>>8)和0xff);
buffer.push_back(值&0xff);
}
void write_float(标准::向量和缓冲区,浮点值)
{
断言(sizeof(float)=sizeof(int32_t));
写入_int32(缓冲区,*(int32_t*)和值);
}

在我使用过的这台机器上,这些比特变换、类型双关的暴行似乎奏效了,但它们感觉非常脆弱。我在哪里可以了解哪些操作可以保证在体系结构、浮点表示等方面产生相同的结果。?具体来说,有没有更安全的方法来完成我在这两个示例函数中所做的工作?

人类可读的表示是最安全的。带有xsd的XML是一种允许您精确指定值和格式的选项

如果确实需要二进制表示,请查看
hton*
ntoh*
函数:


人类可读的表示是最安全的。带有xsd的XML是一种允许您精确指定值和格式的选项

如果确实需要二进制表示,请查看
hton*
ntoh*
函数:


通常最好的方法是使用为此目的设计的外部库——很容易引入平台不一致错误,尤其是在尝试传输浮点类型等信息时。实现这一点的开源软件有多种选择。一个例子是,除了平台无关性之外,它还有语言独立性的好处(它根据您定义的消息生成用于序列化的代码)。

通常最好的方法是使用为此目的设计的外部库——很容易引入平台不一致性错误,尤其是在尝试传输浮点类型等信息时。实现这一点的开源软件有多种选择。一个例子是,它除了具有平台无关性外,还具有独立于语言的优点(它根据您定义的消息生成用于序列化的代码)。

我想要一些快速、轻量级的东西,所以我设计了一种简单而愚蠢的文本序列化格式。每一个值都是使用比

output_buffer << value << ' ';

output\u buffer我想要一些快速轻量级的东西,所以我设计了一种简单而愚蠢的文本序列化格式。每一个值都是使用比

output_buffer << value << ' ';

output\u buffer基本上没有跨平台表示,如果你真的想要一些可移植的东西,你需要定义一些协议:)基本上没有跨平台表示,如果你真的想要一些可移植的东西,你需要定义一些协议:)