Big Endian与Little Endian填充问题

时间:2011-11-09 09:34:36

标签: c operating-system endianness

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

2 个答案:

答案 0 :(得分:1)

您需要牢记以下几点:

  • 每当进行数据通信时,通信协议的结束都是重要的。所有数据通信协议都具有(应该具有)指定的字节顺序。 Big endian可能是最常见的,因为在使用数字电子门而不是软件进行CRC计算的日子里,校验和本身必须是大端。

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

  • 在编写可移植代码时,struct padding将始终导致问题。像send(&my_struct, sizeof(my_struct)这样的代码永远不可移植!因为它会发送数据任何填充字节。填充字节可以是结构内的任何位置,而不仅仅是最终。如果你需要编写真正的可移植代码,你不能使用结构/联合作为数据协议,所有东西都需要存储在字节或类似的数组中,其中数据保证在相邻的单元格中分配。 struct padding与endianess无关,而与CPU指令集无关。

(摩托罗拉CPU传统上对未对齐地址的读取和存储提供了更好的支持,而英特尔衍生产品具有对齐要求,因此更容易使用填充。事实上,摩托罗拉与大端,英特尔在因此巧合的是,小端的CPU更有可能具有填充,但由于CPU指令集而不是,因此只有 而不是因为字节本身。)

答案 1 :(得分:0)

C中的结构是一种在内存中表示数据的方法。 (它为记忆提供了“结构”。)

从“struct”到“字节序列”的任何转换,只是将“struct”位转换掉,并使用C正在使用的任何基础字节表示将受到字节序的影响。 (和填充。也许其他问题,如指针,sizeof(某种积分型)等。)

我怀疑你做的是这样的事情:

// Some non-standard way to get rid of padding in Foo
struct Foo
{
  // Some fields...
}

// Meanwhile, in a function somewhere...
fwrite(a_foo, sizeof(a_foo), 1, fp);

也许你不是在调用fwrite,也许是send,但是,如果你正在进行这样的序列化,你将会受到字节序的影响。