C 代码中的endianness影响

endianness influence in C++ code

本文关键字:endianness 影响 代码      更新时间:2023-10-16

我知道这可能是一个愚蠢的问题,但是我是新手C 开发人员,我需要一些澄清的底漆。

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

目的是:

  1. 将消息编码到要发送在插座上的字节流中(我使用了uint8_t的向量,并将不同字段的每个字节放置在各个字段的每个字节上 - 对单个字节进行分裂UINT16/32/64的照顾 - 遵循大端的big-endian约定)
  2. 通过插座将字节式发送到接收器(使用STCP)
  3. 检索流并解析,以便用正确的元素填充消息对象(由header 电视信息元素表示)

我对在使用界面使用的两台机器的基础体系结构的底层结构的终点感到困惑。我认为,照顾将对象分成单个字节并使用大型派将其定位可以排除,即到达时,流的表示方式有所不同,对吗?还是我错过了什么?

另外,我对多字节变量的C 表示的作用感到怀疑,例如:

uint16_t var=0x0123;
//low byte 0x23 
uint8_t low = (uint8_t)var;
//hi byte 0x01
uint8_t hi = (uint8_t)(var >> 8);

这个代码是否依赖于末端?即,如果我在一台大型机器上工作,我想上述代码还可以,但是如果它是小的,我会以不同的顺序拾取字节吗?

我已经搜索过这样的问题,但是没人给我一个明确的答复,所以我仍然对此有疑问。

预先感谢大家,祝您有美好的一天!

这片代码是否依赖于?

否代码不取决于目标机器的endianess。位操作的工作方式与例如数学运算符。

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


尽管您将数据交换在电线上,但您需要在双方都有一个已知的字节顺序。通常这是网络字节订购(即大端)。

htonx() ntohx()家族的功能将帮助您正确且透明地解码(多键)数字。

您提出的代码是独立的,并且可能是用例正确方法。

什么是不起作用的,也不是便携式的,是取决于对象的内存布局的代码:

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