2011-11-09 33 views
1

在我的代码中有一个有填充问题的结构。我修复了他们,我的代码在一台小型机器上运行良好。这个结构会不会对大型机器造成问题?Big Endian与Little Endian Padding问题

+1

你介意解释这个“填充问题“是?或者,如果小/大端问题很常见,请忽略我的评论。 – CodeCaster

+0

代码请..... – Krishnabhadra

+0

实际上我有一些不是4的倍数的大小的静态数组(代码是32位系统)。我通过使它们成为8的倍数来修复它们。我通过send()将数据发送到某个远程客户端。 –

回答

1

您需要注意以下几点:

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

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

  • 在编写可移植代码时,结构填充总是会引发问题。像send(&my_struct, sizeof(my_struct)这样的代码永远不会携带!因为它会发送数据任何填充字节。填充字节可能在结构内的任何地方,而不仅仅是结尾。如果您需要编写真正可移植的代码,则您不能使用数据协议的结构/联合,所有内容都需要以字节或类似数组的形式存储,其中数据保证在相邻单元中分配。结构填充与endianess无关,而与CPU指令集无关。

(摩托罗拉的CPU传统上有更好的读取和存储在非对齐地址的支持,而英特尔衍生产品有对齐要求,因此更容易使用填充。所以巧合的是,小端CPU更有可能有填充,但这是只有,因为CPU指令集,而不是因为endianess本身。)

0

C中的结构是表示内存中数据的一种方式。 (它给内存“结构”。)

任何从“结构”到“字节序列”的转换,只是将“结构”位转换出来,并使用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,但是,如果你正在做这样的序列化,你将受到排序影响。

+0

是的,你的假设是正确的。其实我有一些不是4的倍数的大小的静态数组(代码是32位系统)。我通过使它们成为8的倍数来修复它们。我通过send()将数据发送到某个远程客户端。 –