我正在使用一個開放源代碼的網絡框架,使開發人員可以通過在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個字節來表示數據包的大小。)
我的問題的所有3個部分的一個很好的答案。 :D – 2011-03-07 14:28:58
Kristopher,會不會有一個懲罰來簡單地將任何更大的類型(或者只是int)轉換爲int32_t?假設高位被截斷是否安全?我從不期望任何數據包大小大於int32_t的最大大小,因此如果數字實際上大於int32_t,那麼它在其他地方都是錯誤的。 – 2011-03-10 21:35:51
智能/安全的事情是在將其投射到更小的類型之前測試該數字。你可能不會期望值太大,但如果黑客可以利用這個(通過發送一個太大的數據包,或發送一個錯誤的數據包),那麼你需要檢查。 – 2011-03-11 13:59:50