在我的代碼中有一個有填充問題的結構。我修復了他們,我的代碼在一臺小型機器上運行良好。這個結構會不會對大型機器造成問題?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()將數據發送到某個遠程客戶端。 –