字节序在C ++代码中的影响

时间:2017-09-01 14:08:33

标签: c++ sockets endianness

我知道这可能是一个愚蠢的问题,但我是一个新手C ++开发人员,我需要对字节顺序做一些澄清。

我必须实现一个依赖于SCTP协议的通信接口,以便在两台不同的机器之间进行通信(一台基于ARM,另一台基于英特尔)。

目的是:

  1. 将消息编码为要在套接字上发送的字节流(我使用了uint8_t的向量,并定位了不同字段的每个字节 - 将uint16 / 32/64拆分为单字节 - 跟随big-endian约定)
  2. 通过套接字将字节流发送到接收方(使用stcp)
  3. 检索流并解析它,以便用正确的元素填充消息对象(由标题+电视信息元素表示)
  4. 我很困惑我在哪里可能会遇到使用该接口的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,我会以不同的顺序拾取字节吗?

    我已经搜索了这些问题,但没有人给我一个明确的答复,所以我仍然对此表示怀疑。

    先谢谢大家,祝你有个美好的一天!

2 个答案:

答案 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 ++指定的任何内容)