Objective c 访问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]时,每个方法返回的值都与控制台不同 你能解释一下为什么会这样吗?我真的不明白我错

我正面临一个我不明白的问题。在开始解释它之前,即使我今年参与了一个使用Objective-C的Swift项目,我对这种语言及其概念还是很陌生

因此,我的问题是:我想访问NSData对象的字节。我知道有几种方法可以做到这一点:

[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*
总是被解释为字符串并打印(有时令人烦恼),除非您告诉调试器其他情况。实际上,最好将
字节
称为
常量*
。这也会打印得更漂亮。