使用NSLog打印NSData

如何使用NSLog打印NSData对象的内容:

-(void) post:(NSString*) msg to:(NSString*) link{ NSString *myRequestString = [NSString stringWithFormat:@"message=%@", msg]; NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: link]]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; [request setHTTPMethod: @"POST"]; [request setHTTPBody: myRequestData]; NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; NSLog("%@", *returnData); //doesn't work } 

我想打印* returnData的内容…

如果你这样做:

 NSLog(@"%@", returnData); 

NSData将以hex格式logging。 我想这可能是你以后的事情。

如果你想把它变成一个string并loggingstring,你首先需要找出使用什么字符集。 HTTP的默认字符集不是UTF-8,而是ISO-8859-1 。 一种方法是检查charset部分的Content-Type头。

将NSData转换为NSString使用

 NSString *strData = [[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding]; 

并在NSLog中打印NSString,如下所示

 NSLog(@"%@",strData); 

这个答案是为JeremyP编辑的,因为他不知道如何知道内容是UTF-8,尽pipe这不是对这个问题的讨论。

你可以在下面的委托方法中得到响应头

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; NSDictionary *dic = [httpResponse allHeaderFields]; } 

这本字典会给你如下所示的整个标题信息

 <CFBasicHash 0x5a45e40 [0x24b2380]>{type = immutable dict, count = 7, entries => 0 : <CFString 0x5d1bf60 [0x24b2380]>{contents = "X-Aspnet-Version"} = <CFString 0x5d21a60 [0x24b2380]>{contents = "2.0.50727"} 1 : <CFString 0x41a03a8 [0x24b2380]>{contents = "Server"} = <CFString 0x5d272f0 [0x24b2380]>{contents = "Microsoft-IIS/6.0"} 2 : <CFString 0x41a0010 [0x24b2380]>{contents = "Content-Length"} = <CFString 0x5d28630 [0x24b2380]>{contents = "385"} 6 : <CFString 0x419ff48 [0x24b2380]>{contents = "Cache-Control"} = <CFString 0x5d29c70 [0x24b2380]>{contents = "private, max-age=0"} 10 : <CFString 0x5d1c640 [0x24b2380]>{contents = "X-Powered-By"} = <CFString 0x5d26f10 [0x24b2380]>{contents = "ASP.NET"} 11 : <CFString 0x41a0060 [0x24b2380]>{contents = "Content-Type"} = <CFString 0x5d29c90 [0x24b2380]>{contents = "text/xml; charset=utf-8"} 12 : <CFString 0x41a0088 [0x24b2380]>{contents = "Date"} = <CFString 0x5d27610 [0x24b2380]>{contents = "Fri, 08 Jul 2011 15:23:10 GMT"} } 

检查charset =“utf-8”,你会从这里得到编码。

有一点你必须考虑:

 NSLog(@"%@", *returnData); // this is wrong. NSLog(@"%@", returnData); // this is correct. 

我希望我能帮上忙

我有时经常想看看NSData究竟代表什么。 通常这是某种文本,这使得hex有点不方便。 因此,我通常将这个片段写在我的Web浏览器的JavaScript控制台中,工作的非常快,如果需要继续处理,可以很容易地进行修改。

  1. 将以下脚本复制/粘贴到浏览器控制台中(右键单击 – >检查元素),按回车

     (function nsDataHexToString() { var str = prompt("Paste the hex string here:", "ié. 48656c6c 6f207468 657265...") var chs = str.replace(/[^A-F0-9]/ig,"").split("") var res = "" var cnt = 2 for (var i = 0; i+cnt-1<chs.length; i+=cnt) { var nr = "" for (var j=0; j<cnt; j++) nr += chs[i+j] nr = parseInt(nr, 16) res += String.fromCharCode(nr) } console.log(res) return res })() 
  2. 运行你的swift / obj-c代码,放入一个断点并检查你的NSData对象

     let sample = "Hello there" let data = sample.dataUsingEncoding(NSUTF8StringEncoding) // Put breakpoint here, hover over "data", and press the eye/i 
  3. 复制hex(类似于<48656c6c 6f207468 657265> )并粘贴到浏览器提示符中

  4. 控制台将显示一个string:“你好”

最近,它是检查从NSAttributedString.dataFromRange的输出, NSAttributedString.dataFromRange使用了一些不同的编码,但我得到了我需要的:)也有用的一些JSON转换问题等。

祝你好运 :)

如果你需要把你的数据字节作为string,请检查这个答案

https://stackoverflow.com/a/7520655/1344237