0

在 beej 的网络指南中,有一节为序列化编组或打包数据,他在其中描述了打包和解包数据的各种功能(int、float、double ..等)。

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

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

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

4

3 回答 3

3

不同的计算机可能会以不同的方式排列数据。经典问题是字节序(在您的示例中,pack[0] 是否具有 MSB 或 LSB)。使用这样的联合将数据与生成它的计算机上的特定表示联系起来。

如果您想查看其他编组数据的方法,请查看Boost 序列化Google protobuf

于 2010-02-25T19:48:54.873 回答
1

为什么不只做 a reinterpret_castto achar*或 a memcpyinto a charbuffer?它们基本上是同一件事,而且不那么令人困惑。

你的想法会奏效,所以如果你愿意,那就去做吧,但我发现干净的代码是快乐的代码。越容易理解我的作品,就越不可能有人(比如我未来的自己)破坏它。

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

于 2010-02-25T19:48:54.410 回答
1

尽管通常可以,但不能保证 union 技巧会起作用。设置 char 数据,然后在尝试读取 int 时读取 0 是完全有效的(根据标准),反之亦然。union 被设计为内存微优化,而不是铸造的替代品。

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

于 2010-02-25T19:52:40.523 回答