2

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

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

这是我附加字节的方法:

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

该问题被报告为警告:

不兼容的整数到指针转换将“int”发送到“const void *”类型的参数

关于完成这项工作的简单方法的任何想法?

4

2 回答 2

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)];

或者NS_ENUM在 ObjC 中。只需确保选择固定宽度的底层类型,而不是typedef因平台/实现而异。

于 2013-09-26T22:19:36.277 回答
1

您需要将指针传递给要附加的数据。您正在传递原始值而不是指针。尝试这个。

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

顺便说一句,我修改了要使用的代码,uint8_t而不是eCodePage基于@justin 的出色建议。

于 2013-09-26T22:10:02.923 回答