2011-11-09 68 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()將數據發送到某個遠程客戶端。 –