2013-09-26 71 views
2
追加單字節NSMutableData

我想輕鬆地追加(從定義十六進制枚舉值)字節到一個NSMutableData,但我有一些類型轉換的問題,這裏是枚舉:從枚舉

typedef enum { 
    eCodePageAirSync   = 0x00, 
    eCodePageContacts   = 0x01, 
... 
    eCodePageRightsManagement = 0x18 
} eCodePage; 

這裏是我的方法追加字節:

[self.WBXMLData appendBytes:eCodePageContacts length:1]; 

問題被報告爲警告:

不兼容的整數婆發送'int'到類型爲'const void *'的參數的內部轉換

任何想法都可以通過簡單的方式完成。

回答

4

您需要定義傳輸的基礎整數表示。如果你的值非負,你可以使用一個無符號類型。由於你的值範圍從0到24,並且適合一個八位字節,所以在這種情況下你不必擔心字節序。因此,在這種情況下,我將使用底層類型uint8_t作爲默認值。

另一個問題是,您需要將內存的地址讀取到appendBytes:length:

代碼寫爲:

const uint8_t value = (uint8_t)eCodePageContacts; 
[self.WBXMLData appendBytes:&value length:sizeof(value)]; 
          ^

對於C,ObjC和C++歷史原因,最窄表示不選擇 - 讓你的枚舉(如聲明)可能是一個int。這意味着當你從一個平臺移動到另一個平臺時,你可以得到不同的值,並且也會出現字節順序。

您可以通過在C++中使用強類型枚舉簡化這個:

enum class eCodePage : uint8_t { 
    eCodePageAirSync   = 0x00, 
    eCodePageContacts   = 0x01, 
    ... 
    eCodePageRightsManagement = 0x18 
}; 

const eCodePage value = eCodePage::eCodePageContacts; 
[self.WBXMLData appendBytes:&value length:sizeof(value)]; 

還是在ObjC NS_ENUM。只要確保選擇固定寬度的底層類型,而不是根據平臺/實現而不同的typedef

+1

Upvoted(儘管我提供了一個不同的答案)爲enum大小和它的怪癖的優秀描述。雖然擔心Objective-C代碼中的可移植性可能被視爲過度消耗,但始終尊重基本原則是件好事。 – StilesCrisis

+1

'enum class'在C++中有其他影響,您可能不想要。 'enum eCodePath:uint8_t'在C++ 11中添加固定的基礎類型而不做其他更改。 –

1

您需要將指針傳遞給要附加的數據。您正在傳遞原始值而不是指針。嘗試這個。

uint8_t data = eCodePageContacts; 
[self.WBXMLData appendBytes:&data length:1]; 

BTW,我修改了代碼,使用uint8_t,而不是eCodePage基於@賈斯汀的優秀建議。

+0

是的,在回到頁面之前,自己偶然發現了,謝謝! – BadPirate