在我的代码中,有一个具有填充问题的结构。我修复了它们,我的代码在一台小端机器上正常运行。这种结构是否有可能导致大端机器出现问题?
答案 0 :(得分:1)
您需要牢记以下几点:
(这可能导致相当模糊的协议,如行业标准现场总线CANopen,其中发送数据中的所有整数必须是小端,但标识符和校验和必须是大端。)
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
,但是,如果你正在进行这样的序列化,你将会受到字节序的影响。