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基本上没有跨平台表示,如果你真的想要一些可移植的东西,你需要定义一些协议:)基本上没有跨平台表示,如果你真的想要一些可移植的东西,你需要定义一些协议:)