在Xcode中查看NSData内容

Bri*_*ian 23 xcode objective-c

我正在运行Xcode,我想转出一个NSData*.有问题的变量是缓冲区.有没有办法通过UI或GDB调试器执行此操作?

这是我在运行时看到的

编辑

我把笔记移到答案中了.

小智 35

没人能正确回答这个问题.2年后,我认为是时候了:)

假设你的代码中有

NSData* myData;
Run Code Online (Sandbox Code Playgroud)

然后在lldb中输入

me read `[myData bytes]` -c`[myData length]`
Run Code Online (Sandbox Code Playgroud)

如果转储的格式不符合您的喜好,您可以添加'-t'

me read `[myData bytes]` -c`[myData length]` -t int
Run Code Online (Sandbox Code Playgroud)

有关更多帮助类型

help me read
Run Code Online (Sandbox Code Playgroud)

在lldb

  • 这就是我需要的答案 - NSData,每个字节打印为两个字符的十六进制值(AB 01 3F等). (3认同)

小智 22

从Xcode 5(lldb),您可以使用以下内容:

po (NSString *)[[NSString alloc] initWithData:buffer encoding:4]
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您的NSData实例已编码NSUTF8StringEncoding,但您可以在标题或文档中查找其他值.

因此,如果您正在调试类似于包含在其中的JSON请求,NSURLSessionDataTask请求数据就在其中task.originalRequest.httpBody,您可以在调试器中查看

po (NSString *)[[NSString alloc] initWithData:task.originalRequest.HTTPBody encoding:4]
Run Code Online (Sandbox Code Playgroud)


Tro*_*roy 15

在lldb中,以下工作可以让您检查NSData对象的内容:

您可以获取用于各种调试器命令的字节地址,如下所示:

p (void *)[buffer bytes]
Run Code Online (Sandbox Code Playgroud)

你看到这样的事情:

(void *) $32 = 0x0b5e11f0
Run Code Online (Sandbox Code Playgroud)

如果您知道基础数据是字符串,则可以执行以下操作:

p (char *)[buffer bytes]
Run Code Online (Sandbox Code Playgroud)

并且调试器将输出:

(char *) $33 = 0x0b5e11f0 "This is the string in your NSData, for example."
Run Code Online (Sandbox Code Playgroud)


Max*_*eod 6

在 Swift 中,这应该可以解决问题:

po String(data:buffer!, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)


Ans*_*ala 5

右键单击buffer并单击Print description of "buffer".

控制台应该说

Printing description of buffer:
<your data here ...>
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 4

不幸的是,到目前为止,所有建议都没有解决实际能够快速显示NSData 内数据的问题。

我编写了一个简单的方法,可以按我需要的方式工作。从 GDB 窗口中,我可以输入内容print [Util dumpData:theData],然后得到漂亮的格式化输出。

+(void) dumpData:(NSData *)data
{
    unsigned char* bytes = (unsigned char*) [data bytes];

    for(int i=0;i< [data length];i++)
    {
        NSString* op = [NSString stringWithFormat:@"%d:%X",i,bytes[i],nil];
        NSLog(@"%@", op);
    }
}
Run Code Online (Sandbox Code Playgroud)

日志输出

0:24
1:0
2:4
3:0
4:0
5:0