Printing NSData using NSLog

后端 未结 5 935
孤城傲影
孤城傲影 2020-12-07 18:26

How can I print the contents of an NSData object using NSLog:

-(void) post:(NSString*) msg to:(NSString*) link{
    NSString *myRequestString = [NSString str         


        
相关标签:
5条回答
  • 2020-12-07 19:06

    One thing you must consider too:

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

    I hope I could help!

    0 讨论(0)
  • 2020-12-07 19:14

    If you do this:

    NSLog(@"%@", returnData); 
    

    The NSData will be logged in hex format. I think that is probably what you are after.

    If you want to turn it into a string and log the string, you first need to find out what character set was used. The default character set for HTTP is not UTF-8, it is ISO-8859-1. One way to do that is to examine the Content-Type header for the charset section.

    0 讨论(0)
  • 2020-12-07 19:23

    I somewhat often want to see what the NSData actually represent. Usually it's some sort of text, which makes hex a bit inconvenient. Therefore I usually write this snippet in the JavaScript console in my web browser, works pretty fast and can be modified easily if some continued processing would be wanted.

    1. Copy/paste the following script into your browser console (right click here -> Inspect element), hit 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. Run your swift/obj-c code, put in a breakpoint and inspect your NSData object

      let sample = "Hello there"
      let data = sample.dataUsingEncoding(NSUTF8StringEncoding)
      // Put breakpoint here, hover over "data", and press the eye/i
      
    3. Copy the hex (something like <48656c6c 6f207468 657265>) and paste into the browser prompt

    4. The console will then show a string: "Hello there"

    Most recently, it was to inspect the output from NSAttributedString.dataFromRange, the rtfd was using a bit different encoding, but I got what I needed :) Also useful for some json conversion issues, etc.

    Good luck :)

    0 讨论(0)
  • 2020-12-07 19:23

    Check this answer if you need to have your data bytes as string

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

    0 讨论(0)
  • 2020-12-07 19:28

    Convert NSData to NSString using

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

    and print NSString in NSLog like below

    NSLog(@"%@",strData);
    

    This answer is edited for JeremyP, as he does not know how to know content is of UTF-8, though it was not a discussion of this question.

    You can get response header in following delegate method

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

    This dictionary will give you entire header info like below

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

    Check charset="utf-8", you will get encoding from here.

    0 讨论(0)
提交回复
热议问题