C 代码中的endianness影响
endianness influence in C++ code
我知道这可能是一个愚蠢的问题,但是我是新手C 开发人员,我需要一些澄清的底漆。
我必须实现依赖SCTP协议的通信界面,以便在两台不同的机器(一个基于ARM的机器和另一个基于Intel的机器)之间进行通信。
目的是:
- 将消息编码到要发送在插座上的字节流中(我使用了uint8_t的向量,并将不同字段的每个字节放置在各个字段的每个字节上 - 对单个字节进行分裂UINT16/32/64的照顾 - 遵循大端的big-endian约定)
- 通过插座将字节式发送到接收器(使用STCP)
- 检索流并解析,以便用正确的元素填充消息对象(由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 指定的任何内容)
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 未达到的情况会影响开关外壳性能
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 模板如何影响C++中隐式声明的规则?
- 命名空间信息会影响C++的可读性
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 检查nullptr是否100%保护内存布局不受segfault影响
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- QSql查询行受影响的结果
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 是否有任何区域设置会影响宽字符编码?
- C 代码中的endianness影响