工会可以执行编组或包装吗?

时间:2010-02-25 19:42:22

标签: c++ c marshalling packing

在beej的网络指南中,有一部分用于序列化的编组或打包数据,其中描述了用于打包和解包数据的各种函数(int,float,double ..等)。

使用union更容易(类似可以定义为float和double),如下所定义,并将integer.pack作为packed.i的打包版本传输,而不是打包和解包函数。

union _integer{
  char pack[4];
  int i;
}integer;
  1. 有人可以解释为什么工会是一个糟糕的选择吗?

  2. 有没有更好的打包数据的方法?

3 个答案:

答案 0 :(得分:3)

不同的计算机可能会以不同方式放置数据。经典问题是endianess(在您的示例中,pack [0]是否具有MSB或LSB)。使用这样的联合将数据绑定到生成它的计算机上的特定表示。

如果您想查看其他方法来管理数据,请查看Boost serializationGoogle protobuf

答案 1 :(得分:1)

为什么不在[{1}}缓冲区中reinterpret_castchar*memcpy?它们基本上是相同的东西,而且不那么令人困惑。

你的想法会起作用,所以如果你愿意,可以去找它,但我发现干净的代码是快乐的代码。理解我的工作越容易,某人(比如我未来的自我)就会越不可能破坏它。

另请注意,只有POD(普通旧数据)类型可以放在并集中,这会对联合方法施加一些限制,而不是更直观的那种。

答案 2 :(得分:1)

联合技巧并不能保证有效,尽管通常会这样。设置char数据完全有效(根据标准),然后在尝试读取int时读取0,反之亦然。 union被设计成一种记忆微优化,而不是铸造的替代品。

此时,通常要么将转换包装在一个方便的对象中,要么使用reinterpret_cast。稍微笨重或丑陋......但是当你打包数据时,这些都不一定是坏事。