从Enum向NSMutableData附加单个字节

时间:2013-09-26 21:59:03

标签: c++ objective-c c casting enums

我正在尝试轻松地将字节(从定义的十六进制枚举值)附加到NSMutableData上,但我遇到了一些类型转换问题,这里是枚举:

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

这是我附加字节的方法:

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

该问题被报告为警告:

  

不兼容的整数到指针转换将'int'发送到'const void *'

类型的参数

有什么想法可以轻松完成这项工作吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您需要传递指向要追加的数据的指针。您正在传递原始值而不是指针。试试这个。

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

BTW,我根据@ justin的优秀建议修改了代码,使用uint8_t代替eCodePage