在我的代码中有一个有填充问题的结构。我修复了他们,我的代码在一台小型机器上运行良好。这个结构会不会对大型机器造成问题?Big Endian与Little Endian Padding问题
1
A
回答
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()将数据发送到某个远程客户端。 –
相关问题
- 1. Little endian与Big endian
- 2. big-endian && little -endian?
- 3. mmap big endian与little endian
- 4. Big-endian与little-endian机器
- 5. big endian vs little endian
- 6. Little-endian和Big-endian
- 7. Oracle RMAN big-endian到little-endian
- 8. Little和Big Endian值
- 9. 显示Big/Little Endian?
- 10. C#Little-Endian转换Java Big-Endian
- 11. Little Endian和Big endian c程序
- 12. 0x12345678的特殊Big endian little endian表示?
- 13. 在c中转换little endian为big endian#
- 14. Perl:如何将big endian转换为little endian
- 15. Little Endian Macros
- 16. 使用MIPS而没有逻辑操作的Big Endian到Little Endian?
- 17. 在AS3中将Little-endian ByteArray转换为Big-endian
- 18. 从使用big endian转换为little endian的过程有多快?
- 19. 在windows下C中数据的字节表示。 Big-endian&little endian
- 20. Big Endian和Little Endian支持字节排序
- 21. 如何在Java中编写big endian ByteBuffer到little endian
- 22. 将32位变量以Big Endian顺序转换为Little Endian
- 23. 在VBA中将big-endian转换成little-endian,反之亦然
- 24. Little Endian封包被dpkt处理为big endian
- 25. 我如何使用htonl将little endian转换为big endian
- 26. 结构体std :: vector的big-> little(little-> big)endian转换
- 27. 将float数组转换成little/big endian
- 28. Little Endian编码
- 29. little endian DataInputStream
- 30. Little Endian位掩码
你介意解释这个“填充问题“是?或者,如果小/大端问题很常见,请忽略我的评论。 – CodeCaster
代码请..... – Krishnabhadra
实际上我有一些不是4的倍数的大小的静态数组(代码是32位系统)。我通过使它们成为8的倍数来修复它们。我通过send()将数据发送到某个远程客户端。 –