C ++代码中的字节序影响
endianness influence in C++ code
我知道这可能是一个愚蠢的问题,但我是一名新手 C++ 开发人员,我需要一些关于字节顺序的说明。
我必须实现一个依赖 SCTP 协议的通信接口,以便在两台不同的机器(一台基于 ARM,另一台基于 Intel)之间进行通信。
目的是:
- 将消息编码为要在套接字上发送的字节流(我使用了 uint8_t 的向量,并定位了不同字段的每个字节 - 注意将 uint16/32/64 拆分为单个字节- 遵循 big-endian 约定)
- 通过套接字将字节流发送到接收器(使用 stcp)
- 检索流并解析它以便用正确的元素(由 header + TV 信息元素表示)
填充消息 object
我对将使用接口的两台机器的底层架构的字节顺序有问题的地方感到困惑。
我认为注意将 object 拆分为单个字节并使用 big-endian 定位它们可以排除在到达时流以不同方式表示的情况,对吧?还是我遗漏了什么?
此外,我对 multiple-byte 变量的 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,我会以不同的顺序获取字节吗?
我已经搜索过这样的问题,但没有人给我明确的答复,所以我对此仍有疑问。
提前谢谢大家,祝大家有个愉快的一天!
This piece of code is endianness dependent or not?
不,代码不依赖于目标机器的字节顺序。按位运算的工作方式与例如相同数学运算符。
它们独立于数字的内部表示。
尽管如果您通过网络交换数据,则需要双方都知道定义的字节顺序。通常这是网络字节顺序(即大端)。
htonx()
ntohx()
系列的功能将帮助您en-/decode 正确且透明地处理(多字节)数字。
您提供的代码与字节顺序无关,并且可能是您用例的正确方法。
取决于对象内存布局的代码将无法工作且不可移植:
// 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++ 指定的任何值)
我知道这可能是一个愚蠢的问题,但我是一名新手 C++ 开发人员,我需要一些关于字节顺序的说明。
我必须实现一个依赖 SCTP 协议的通信接口,以便在两台不同的机器(一台基于 ARM,另一台基于 Intel)之间进行通信。
目的是:
- 将消息编码为要在套接字上发送的字节流(我使用了 uint8_t 的向量,并定位了不同字段的每个字节 - 注意将 uint16/32/64 拆分为单个字节- 遵循 big-endian 约定)
- 通过套接字将字节流发送到接收器(使用 stcp)
- 检索流并解析它以便用正确的元素(由 header + TV 信息元素表示) 填充消息 object
我对将使用接口的两台机器的底层架构的字节顺序有问题的地方感到困惑。 我认为注意将 object 拆分为单个字节并使用 big-endian 定位它们可以排除在到达时流以不同方式表示的情况,对吧?还是我遗漏了什么?
此外,我对 multiple-byte 变量的 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,我会以不同的顺序获取字节吗?
我已经搜索过这样的问题,但没有人给我明确的答复,所以我对此仍有疑问。
提前谢谢大家,祝大家有个愉快的一天!
This piece of code is endianness dependent or not?
不,代码不依赖于目标机器的字节顺序。按位运算的工作方式与例如相同数学运算符。
它们独立于数字的内部表示。
尽管如果您通过网络交换数据,则需要双方都知道定义的字节顺序。通常这是网络字节顺序(即大端)。
htonx()
ntohx()
系列的功能将帮助您en-/decode 正确且透明地处理(多字节)数字。
您提供的代码与字节顺序无关,并且可能是您用例的正确方法。
取决于对象内存布局的代码将无法工作且不可移植:
// 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++ 指定的任何值)