访问 NSData 字节 - 调试器上的值不同

Accessing NSData bytes - Not the same value on debugger

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

所以,这是我的问题:我想访问 NSData 对象的字节。我知道有几种方法可以这样做:

[data bytes]; 

data.bytes;

[data getBytes: dest, length: [data length]];

但是当我使用 po [data bytes].

时,每种方法 return 与控制台的值不同

你能解释一下为什么会这样吗?我真的不明白我错过了什么。

谢谢。

datadata.bytes是两种完全不同的类型。 dataNSData 的实例,而 data.bytes 是原始指针 (const void *)。当您在调试器中调用 po("print object" 的缩写)时,它会在继承自 NSObject 的对象上调用 -description,如果没有,则只打印值。

在这种情况下,由于 data 是一个 NSData(其中有 -description),如果您 po data,它会调用 [data description] 并打印出来的结果;因为 NSData 知道如何很好地格式化其内容,所以它会很好地打印。

然而,由于 data.bytes 是一个 void *,调试器无法知道如何打印它(void * 可以指向任何东西;如何解释它是完全取决于你)所以它只是打印出指针本身。

如果你想直接从调试器打印数据,你可以告诉它如何解释指针并打印出来。如果您知道数据 blob 的长度为 n 字节,则可以 运行 以下命令:

p/x *(uint8_t (*)[<n>])data.bytes

其中 <n> 替换为数据的文字长度(例如 uint8_t (*)[8]))。 *(uint8_t (*)[<n>])data.bytes 告诉调试器将 data.bytes 重新解释为 n 字节的数组(给它长度,以便它知道要从内存中读取多少数据),而 p/x 告诉它打印它找到的字节的十六进制值。