【发布时间】:2021-08-05 11:19:07
【问题描述】:
union Chunk
{
struct { uint32_t index, total; } m_;
uint64_t m_PlaceHolder;
} chunk;
chunk.m_.index = 1;
chunk.m_.total = 2;
SendOverTCPNetwork(chunk.m_PlaceHolder); // different platform OS will receive this
为 2 个整数设置联合成员,然后通过 TCP 网络发送一个(组合的)长整数,如上面伪代码所示。
问题:源机器和目标机器的字节序会影响chunk变量的值吗?
换句话说,我们会在另一边收到相同的值吗?
【问题讨论】:
-
想象
SendOverTCPNetwork()对每个基本类型都进行了重载,以修复(以防万一)其参数的字节顺序,例如网络字节顺序。假设本地 LE 和 BE 通过 TCP,这不仅会改变index和total的字节序,还会改变它们的顺序。 -
我的建议是不要让网络 API 接受整数。你应该通过
std::bytes 或chars。你应该有一个转换函数,负责用你的整数/结构中的数据填充byte[],并酌情使用位移位。这样,您就可以 100% 移植并独立于主机字节序。避开hton和朋友。 -
现在问题已被编辑,它是通过联合进行类型双关语,这仍然是错误的,但方式不同。无论如何,您都是通过网络发送数据,只需将对象地址转换为
char*而不是使用一些中间类型。
标签: c++ cross-platform union long-integer endianness