2011-07-08 32 views
46

Làm thế nào tôi có thể in các nội dung của một đối tượng sử dụng NSData NSLog:In ấn NSData sử dụng NSLog

-(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 

} 

Tôi muốn in nội dung của * returnData ...

+0

không phải là một phần của vấn đề ở đây mà bạn đang sử dụng NSLog ("") chứ không phải NSLog (@ ""). (Aka bạn đang đi qua một chuỗi C và không NSString?) (Bất kể định dạng?) – portforwardpodcast

Trả lời

57

Nếu bạn làm điều này:

NSLog(@"%@", returnData); 

Các NSData sẽ được đăng nhập dưới dạng hex. Tôi nghĩ rằng đó có thể là những gì bạn đang sau.

Nếu bạn muốn biến nó thành chuỗi và đăng chuỗi, trước tiên bạn cần phải tìm hiểu xem bộ ký tự nào đã được sử dụng. Bộ ký tự mặc định cho HTTP không phải là UTF-8, nó là ISO-8859-1. Một cách để làm điều đó là kiểm tra tiêu đề Content-Type cho phần bộ ký tự.

+4

Đây là câu trả lời đúng, bạn không thể giả định mã hóa nội dung của dữ liệu! Có một lý do cho tiêu đề http, dấu thứ tự byte vv, tất cả văn bản không giống nhau. – Joe

+0

Bất kỳ ai muốn giải thích phiếu bầu xuống? – JeremyP

+0

Tôi nghĩ đây là câu trả lời hay hơn. – antonio081014

77

Chuyển đổi NSData để NSString sử dụng

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

và in NSString trong NSLog như dưới đây

NSLog(@"%@",strData); 

Câu trả lời này được chỉnh sửa cho JeremyP, vì anh ta không biết làm thế nào để biết nội dung là của UTF-8, mặc dù nó không phải là một cuộc thảo luận về câu hỏi này.

Bạn có thể nhận đáp ứng tiêu đề trong theo phương pháp đại biểu

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

từ điển này sẽ cung cấp cho bạn toàn bộ thông tin tiêu đề như dưới đây

<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"} 
} 

Kiểm tra charset = "utf-8", bạn sẽ nhận được mã hóa từ đây.

+0

nếu nó hoạt động cho bạn, bạn có thể đánh dấu nó là câu trả lời, vì vậy những người khác có thể xem nó như là câu trả lời đúng? – iMOBDEV

+0

nó cho tôi điều này -> cảnh báo: chuyển đối số 1 của 'NSLog' từ kiểu con trỏ không tương thích – user559142

+0

bạn cần phải làm NSLog (strData); bạn đang đi đâu để NSLog? – iMOBDEV

4

Một điều bạn phải xem xét quá:

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

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

Tôi hy vọng tôi có thể giúp đỡ!

+5

bạn quên thêm @ vào chức năng NSLog. –

3

Tôi hơi thường muốn xem những gì NSData thực sự đại diện. Thông thường nó là một số loại văn bản, mà làm cho hex một chút bất tiện. Vì vậy, tôi thường viết đoạn mã này trong bảng điều khiển JavaScript trong trình duyệt web của tôi, hoạt động khá nhanh và có thể được sửa đổi dễ dàng nếu một số xử lý tiếp tục sẽ được sử dụng.

  1. Copy/dán đoạn mã sau vào giao diện điều khiển trình duyệt của bạn (click chuột phải ở đây -> Inspect element), nhấn Enter

    (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. Khởi mã nhanh chóng/obj-c của bạn, đưa vào một breakpoint và kiểm tra đối tượng NSData bạn

    let sample = "Hello there" 
    let data = sample.dataUsingEncoding(NSUTF8StringEncoding) 
    // Put breakpoint here, hover over "data", and press the eye/i 
    
  3. Sao chép hex (cái gì đó như <48656c6c 6f207468 657265>) và dán vào cửa sổ trình duyệt

  4. Giao diện điều khiển sau đó sẽ hiển thị một chuỗi: "Hello there"

Gần đây nhất, đó là kiểm tra đầu ra từ NSAttributedString.dataFromRange, các rtfd đã sử dụng một chút mã hóa khác nhau, nhưng tôi nhận được những gì tôi cần :) Cũng hữu ích cho một số vấn đề chuyển đổi json, v.v.

Chúc may mắn :)

+0

Điều này xứng đáng với tất cả các phiếu bầu –

+0

Thx @CoryImdieke! vui vì nó đã giúp :) –