我正在尝试轻松地将字节(从定义的十六进制枚举值)附加到NSMutableData上,但我遇到了一些类型转换问题,这里是枚举:
typedef enum {
eCodePageAirSync = 0x00,
eCodePageContacts = 0x01,
...
eCodePageRightsManagement = 0x18
} eCodePage;
这是我附加字节的方法:
[self.WBXMLData appendBytes:eCodePageContacts length:1];
该问题被报告为警告:
不兼容的整数到指针转换将'int'发送到'const void *'
类型的参数
有什么想法可以轻松完成这项工作吗?
答案 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
。