访问 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 与控制台的值不同
你能解释一下为什么会这样吗?我真的不明白我错过了什么。
谢谢。
data
和data.bytes
是两种完全不同的类型。 data
是 NSData
的实例,而 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
告诉它打印它找到的字节的十六进制值。
我遇到了一个我不明白的问题。在开始解释之前,即使我今年参与了一个 Swift 项目并使用了一些 Objective-C,我对这种语言及其概念还是陌生的。
所以,这是我的问题:我想访问 NSData 对象的字节。我知道有几种方法可以这样做:
[data bytes];
data.bytes;
[data getBytes: dest, length: [data length]];
但是当我使用 po [data bytes]
.
你能解释一下为什么会这样吗?我真的不明白我错过了什么。
谢谢。
data
和data.bytes
是两种完全不同的类型。 data
是 NSData
的实例,而 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
告诉它打印它找到的字节的十六进制值。