【发布时间】:2018-02-10 15:02:40
【问题描述】:
我知道这可能是一个愚蠢的问题,但我是一名 C++ 开发新手,我需要对字节序进行一些说明。
我必须实现一个依赖于 SCTP 协议的通信接口,以便在两台不同的机器(一台基于 ARM,另一台基于 Intel)之间进行通信。
我们的目标是:
- 将消息编码为要在套接字上发送的字节流(我使用了一个 uint8_t 向量,并定位了不同字段的每个字节 - 将 uint16/32/64 拆分为单个字节 - 遵循 big-endian约定)
- 通过套接字将字节流发送到接收器(使用stcp)
- 检索流并对其进行解析,以便用正确的元素(由标头 + TV 信息元素表示)填充消息对象
我对使用接口的两台机器的底层架构的字节顺序可能存在问题感到困惑。 我认为将对象拆分为单个字节并使用大端序定位它们可以排除在到达时流的表示方式不同,对吧?还是我错过了什么?
另外,我对C++表示多字节变量的作用存有疑问,例如:
uint16_t var=0x0123;
//low byte 0x23
uint8_t low = (uint8_t)var;
//hi byte 0x01
uint8_t hi = (uint8_t)(var >> 8);
这段代码是否依赖字节序?即如果我在大端机器上工作,我想上面的代码是可以的,但如果是小端,我会以不同的顺序获取字节吗?
我已经搜索过这样的问题,但没有人给我明确的答复,所以我对此仍有疑问。
提前谢谢大家,祝你有美好的一天!
【问题讨论】:
-
reinterpret_cast<uint8_t*>(&var)[0]会因字节顺序而异。 -
您可以
reinterpret_cast<uint8_t&>var避免冗长和混乱的语法。 -
现在我想起来了,
uint8_t不一定是unsigned char的 typedef,所以将uint16_t的一部分重新解释为uint8_t实际上是未定义的。 -
@patatahooligan:如果您发送消息,则缺少括号。
[0]主要是一个占位符,因为[1]也会以同样有问题的方式使用。 -
确实对于迂腐的 UB 部分。
标签: c++ sockets endianness