我知道这可能是一个愚蠢的问题,但我是一个新手C ++开发人员,我需要对字节顺序做一些澄清。
我必须实现一个依赖于SCTP协议的通信接口,以便在两台不同的机器之间进行通信(一台基于ARM,另一台基于英特尔)。
目的是:
我很困惑我在哪里可能会遇到使用该接口的2台机器的底层架构的字节序问题。 我认为将对象拆分为单个字节并使用big-endian进行定位可以排除在到达时,流的表示方式不同,对吧?或者我错过了什么?
另外,我对多字节变量的C ++表示的作用存在疑问,例如:
uint16_t var=0x0123;
//low byte 0x23
uint8_t low = (uint8_t)var;
//hi byte 0x01
uint8_t hi = (uint8_t)(var >> 8);
这段代码是否依赖于字节顺序?即如果我在big-endian机器上工作,我认为上面的代码是可以的,但是如果它是little-endian,我会以不同的顺序拾取字节吗?
我已经搜索了这些问题,但没有人给我一个明确的答复,所以我仍然对此表示怀疑。
先谢谢大家,祝你有个美好的一天!
答案 0 :(得分:6)
这段代码是否依赖于字节序?
没有代码不依赖于目标机器的endianess。按位运算的工作方式与例如数学运算符。
它们与数字的内部表示无关。
虽然如果您通过线路交换数据,您需要在两端都知道已定义的字节顺序。通常是网络字节排序(即大端)。
htonx()
ntohx()
系列的功能将帮助您正确,透明地对(多字节)数字进行解码。
答案 1 :(得分:2)
您提供的代码与字节顺序无关,可能是正确的方法用于您的用例。
不能工作且不可移植的代码取决于对象的内存布局:
// Don't do this!
uint16_t var=0x0123;
auto p = reinterpret_cast<char*>(&var);
uint8_t hi = p[0]; // 0x01 or 0x23 (probably!)
uint8_t lo = p[1]; // 0x23 or 0x01 (probably!)
(我在评论中写了可能是,以表明这些可能是现实世界的价值,而不是标准C ++指定的任何内容)