在beej的网络指南中,有一部分用于序列化的编组或打包数据,其中描述了用于打包和解包数据的各种函数(int,float,double ..等)。
使用union更容易(类似可以定义为float和double),如下所定义,并将integer.pack作为packed.i的打包版本传输,而不是打包和解包函数。
union _integer{
char pack[4];
int i;
}integer;
有人可以解释为什么工会是一个糟糕的选择吗?
有没有更好的打包数据的方法?
答案 0 :(得分:3)
不同的计算机可能会以不同方式放置数据。经典问题是endianess(在您的示例中,pack [0]是否具有MSB或LSB)。使用这样的联合将数据绑定到生成它的计算机上的特定表示。
如果您想查看其他方法来管理数据,请查看Boost serialization和Google protobuf。
答案 1 :(得分:1)
为什么不在[{1}}缓冲区中reinterpret_cast
到char*
或memcpy
?它们基本上是相同的东西,而且不那么令人困惑。
你的想法会起作用,所以如果你愿意,可以去找它,但我发现干净的代码是快乐的代码。理解我的工作越容易,某人(比如我未来的自我)就会越不可能破坏它。
另请注意,只有POD(普通旧数据)类型可以放在并集中,这会对联合方法施加一些限制,而不是更直观的那种。
答案 2 :(得分:1)
联合技巧并不能保证有效,尽管通常会这样。设置char数据完全有效(根据标准),然后在尝试读取int时读取0,反之亦然。 union被设计成一种记忆微优化,而不是铸造的替代品。
此时,通常要么将转换包装在一个方便的对象中,要么使用reinterpret_cast。稍微笨重或丑陋......但是当你打包数据时,这些都不一定是坏事。