2011-03-07 40 views
5

我正在使用一個開放源代碼的網絡框架,使開發人員可以通過在Objective-C中使用Bonjour發現的服務進行通信。在Objective-C中,當sizeof(int)不是4個字節?

現在有幾條線讓我處於邊緣狀態,即使它們在我測試過的任何機器上似乎都沒有造成任何問題,無論我是否運行32位我的應用程序的64位版本:

int packetLength = [rawPacketData length]; 
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)]; 
[outgoingBuffer appendData:rawPacketData]; 
[self writeToStream]; 

注意,發送的第一片的信息是所述數據分組,這是相當標準的,然後將數據本身被髮送的長度。什麼嚇到我是長度爲的長度。一臺機器是否會假定int是4個字節,而另一臺機器是否認爲int是8個字節?

如果兩種尺寸在不同的機器上可能不同,會導致這種情況?它依賴於我的編譯器還是最終用戶的機器體系結構?最後,如果這是一個問題,我如何獲取8字節的int並將其縮小到4字節以確保向後兼容? (因爲我永遠不需要超過4個字節來表示數據包的大小。)

回答

14

您不能假設sizeof(int)將始終是四個字節。如果大小很重要,您應該對4的大小進行硬編碼(並且編寫代碼將值序列化爲具有適當的字節順序的四字節數組),或者使用類型如<stdint.h>中定義的int32_t

(然而,作爲一個實際問題,大多數編譯器廠商已經決定int應該留四個字節,所以你可能不必擔心打破一切明天再說,這是不是很久以前許多編譯開發商讓一個int是兩個字節,導致許多問題,當ints成爲四個字節,所以你真的應該做的事情對未來的變化,從而以正確的方式後衛。)

+0

我的問題的所有3個部分的一個很好的答案。 :D – 2011-03-07 14:28:58

+0

Kristopher,會不會有一個懲罰來簡單地將任何更大的類型(或者只是int)轉換爲int32_t?假設高位被截斷是否安全?我從不期望任何數據包大小大於int32_t的最大大小,因此如果數字實際上大於int32_t,那麼它在其他地方都是錯誤的。 – 2011-03-10 21:35:51

+0

智能/安全的事情是在將其投射到更小的類型之前測試該數字。你可能不會期望值太大,但如果黑客可以利用這個(通過發送一個太大的數據包,或發送一個錯誤的數據包),那麼你需要檢查。 – 2011-03-11 13:59:50

1

這可能是不同的,但是這取決於在編譯器上比機器多。不同的編譯器可能會重新聲明int爲8個字節。

0

我以爲只有long在32位或64位系統的大小不同?

0

int的大小取決於機器結構; int的大小几乎總是數據總線的大小,除非你的C編譯器做了一些特別的改變。

這意味着當您在8位,16位或64位機器/體系結構中編譯程序時,int的大小不是4個字節。

我會爲緩衝區大小而不是使用int大小定義一個常量。

希望這回答你的問題。

+0

我不確定這一點。當我編譯/運行我的應用程序爲32位或64位時,sizeof(int)在兩種情況下都是4。 – 2011-03-07 14:43:54

+0

C標準只規定sizeof(int)至少爲2.它應該是機器體系結構中整數的最「自然」大小,但編譯器實現者可以選擇他們想要的任何大小。 – 2011-03-07 14:51:57

+0

@craig由於您當前的機器是32位機器,Apple A4處理器,對吧? – 2011-03-07 14:54:22

相關問題