Objective c 访问NSData字节-调试器上的值不同
我正面临一个我不明白的问题。在开始解释它之前,即使我今年参与了一个使用Objective-C的Swift项目,我对这种语言及其概念还是很陌生 因此,我的问题是:我想访问NSData对象的字节。我知道有几种方法可以做到这一点:Objective c 访问NSData字节-调试器上的值不同,objective-c,console,byte,nsdata,Objective C,Console,Byte,Nsdata,我正面临一个我不明白的问题。在开始解释它之前,即使我今年参与了一个使用Objective-C的Swift项目,我对这种语言及其概念还是很陌生 因此,我的问题是:我想访问NSData对象的字节。我知道有几种方法可以做到这一点: [data bytes]; data.bytes; [data getBytes: dest, length: [data length]]; 但是,当我使用po[data bytes]时,每个方法返回的值都与控制台不同 你能解释一下为什么会这样吗?我真的不明白我错
[data bytes];
data.bytes;
[data getBytes: dest, length: [data length]];
但是,当我使用po[data bytes]
时,每个方法返回的值都与控制台不同
你能解释一下为什么会这样吗?我真的不明白我错过了什么
谢谢。
数据
和数据。字节
是两种完全不同的类型data
是NSData
的实例,而data.bytes
是原始指针(const void*
)。当您在调试器中调用po
(是“打印对象”的缩写)时,它将对继承自NSObject
的对象调用-description
,如果没有,则只打印值
在这种情况下,由于data
是一个NSData
(具有-description
),如果您po data
,它将调用[data description]
,并打印输出结果;由于NSData
知道如何很好地格式化其内容,因此它将很好地打印
但是,由于data.bytes
是一个void*
,调试器无法知道如何打印它(void*
可以指向任何东西;如何解释它完全取决于您),所以它只打印指针本身
如果要直接从调试器打印数据,可以告诉调试器如何解释指针并将其打印出来。如果知道数据blob的长度为n
字节,则可以运行以下命令:
p/x *(uint8_t (*)[<n>])data.bytes
p/x*(uint8_t(*)[])data.bytes
其中,
替换为数据的文字长度(例如,uint8\u t(*)[8])
)*(uint8_t(*)data.bytes
告诉调试器重新解释数据。bytes
作为n
字节的数组(赋予它长度以便它知道从内存中读取多少数据),而p/x
告诉它打印找到的字节的十六进制值。感谢您的响应,现在已经非常清楚了。但是,当我在控制台中使用命令po[data bytes]
时,它会打印类似0x14ee2ee8的内容。当我使用命令pobytes
,其中bytes是[data bytes]的结果,它会打印类似“3w\x80\x88\x17”的内容。po[data bytes]
返回的值到底是什么?当您将[data bytes]
存储在变量bytes
中时,bytes
的类型是什么?你的声明是什么样子的?字节
是一个常量字符*
。啊-这是有区别的。如果查看,您将看到[data bytes]
的返回类型是const void*
。C和Objective-C中的void*
表示“这可以指向任何东西,如果你想实际使用这个指针,你必须将它转换为你知道的类型”。当您在调试器中打印出void*
时,它无法知道如何解释它,因此它会打印指针。然而,const char*
是一种它知道如何处理的类型,因此它将其打印为字符串。在调试器中,char*
总是被解释为字符串并打印(有时令人烦恼),除非您告诉调试器其他情况。实际上,最好将字节
称为常量*
。这也会打印得更漂亮。