c - Big Endian 与 Little Endian 填充问题

标签 c operating-system endianness

在我的代码中有一个结构存在填充问题。我修复了它们,我的代码在小端机器上运行良好。这种结构是否有可能导致大端机器出现问题??

最佳答案

您需要牢记以下几点:

  • 无论何时进行数据通信,通信协议(protocol) 的字节序都是最重要的。所有数据通信协议(protocol)都有(应该有)指定的字节顺序。大端可能是最常见的,因为在 CRC 计算是通过数字电子门而不是软件完成的时代,校验和本身必须是大端。

(这可能会导致相当模糊的协议(protocol),例如行业标准现场总线 CANopen,其中发送数据中的所有整数必须是小端,但标识符和校验和必须是大端。)

  • 在编写可移植代码时,结构填充总是会导致问题。像 send(&my_struct, sizeof(my_struct) 这样的代码是不可移植的!因为它会发送数据 任何填充字节。填充字节可以在结构内的任何地方,而不是就在最后。如果您需要编写真正可移植的代码,您不能将结构/union 用于数据协议(protocol),所有内容都需要存储在字节数组或类似的数组中,其中数据保证分配在相邻的单元格中。结构填充与字节顺序无关,而是与 CPU 指令集有关。

(摩托罗拉 CPU 传统上更好地支持读取和存储未对齐的地址,而英特尔的衍生产品有对齐要求,因此更倾向于使用填充。碰巧的是,摩托罗拉采用大字节序,而英特尔采用小字节序endians。所以巧合的是,little endian CPU 更可能有填充,但这只是因为 CPU 指令集,而不是因为 endianess 本身。)

关于c - Big Endian 与 Little Endian 填充问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8062916/

相关文章:

c - 表格长度运算符的性能

c - BST 插入不起作用

linux - 结构 buffer_head 效率低下

macos - 如何在 Mac OS 上查看应用程序证书。?

c - 如果我们尝试使用集群解锁一个已经解锁的文件会发生什么?克朗

c++ - Boost Binary Endian 解析器不工作?

c - mmap() 和锁定文件

c - 为什么连续数组条目的地址不是连续的?

mmap 大端与小端

c - 显示大/小字节序?