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

pan*_*fab 4 c++ sockets endianness

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

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

目的是:

  1. 将消息编码为要在套接字上发送的字节流(我使用了uint8_t的向量,并定位了不同字段的每个字节 - 将uint16/32/64拆分为单字节 - 遵循big-endian约定)
  2. 通过套接字将字节流发送到接收器(使用stcp)
  3. 检索流并解析它,以便用正确的元素填充消息对象(由标题+电视信息元素表示)

我很困惑,我可能会遇到使用接口的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);
Run Code Online (Sandbox Code Playgroud)

这段代码是否依赖于字节序?即如果我在big-endian机器上工作,我认为上面的代码是可以的,但如果它是little-endian,我会以不同的顺序拾取字节吗?

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

提前谢谢大家,祝你有愉快的一天!

use*_*042 6

这段代码是否依赖于字节序?

没有代码不依赖于目标机器的endianess.按位运算的工作方式与数学运算符的工作方式相同.

它们独立于数字的内部表示.


虽然如果您通过线路交换数据,则需要在两端都知道已定义的字节顺序.通常是网络字节排序(即大端).

htonx() ntohx()系列的功能将帮助您正确,透明地对(多字节)数字进行解码/解码.