2011-07-08 18 views
46

cómo se puede imprimir el contenido de un objeto utilizando NSData NSLog:impresión NSData usando 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 

} 

quisiera imprimir el contenido de * returnData ...

+0

no es parte del problema aquí que está utilizando NSLog ("") y no NSLog (@ ""). (¿Aka está pasando una cadena C y no NSString?) (Independientemente del formato?) – portforwardpodcast

Respuesta

57

Si hace esto:

NSLog(@"%@", returnData); 

El NSData se registra en formato hexadecimal. Creo que eso es probablemente lo que buscas.

Si desea convertirlo en una cadena y registrar la cadena, primero debe averiguar qué conjunto de caracteres se utilizó. El juego de caracteres predeterminado para HTTP no es UTF-8, es ISO-8859-1. Una forma de hacerlo es examinar el encabezado Content-Type para la sección del juego de caracteres.

+4

¡Esta es la respuesta correcta, no puede asumir la codificación de datos de contenido! Hay un motivo para encabezados http, marcas de orden de bytes, etc., todo el texto no es lo mismo. – Joe

+0

¿Alguien quiere explicar el voto hacia abajo? – JeremyP

+0

Creo que esta es una mejor respuesta. – antonio081014

77

Convertir NSData a NSString usando

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

e imprimir NSString en NSLog, como a continuación

NSLog(@"%@",strData); 

Esta respuesta está editada para JeremyP, ya que no sabe cómo saber el contenido de UTF-8, aunque no fue una discusión de esta pregunta.

Puede obtener cabecera de respuesta en siguiente método delegado

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

Este diccionario le dará información de la cabecera entera, como a continuación

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

Comprobar charset = "UTF-8", obtendrá codificación de aquí.

+0

si le funciona, ¿puede marcarla como respuesta para que otros puedan verla como respuesta correcta? – iMOBDEV

+0

me da esto -> advertencia: pasar el argumento 1 de 'NSLog' desde el tipo de puntero incompatible – user559142

+0

necesita hacer NSLog (strData); ¿Qué estás pasando a NSLog? – iMOBDEV

4

Una cosa que debe tener en cuenta también:

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

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

espero poder ayudar!

+5

olvidó agregar @ en la función NSLog. –

3

que tanto a menudo quieren ver lo que el NSData representan en realidad. Usualmente es algún tipo de texto, lo que hace que hex sea un poco incómodo. Por lo tanto, generalmente escribo este fragmento en la consola de JavaScript en mi navegador web, funciona bastante rápido y se puede modificar fácilmente si se desea un procesamiento continuo.

  1. Copia/pega el siguiente script en la consola del navegador (derecha clic aquí -> Inspeccionar elemento), pulse intro

    (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. ejecutar el código SWIFT/obj-c, poner en un punto de interrupción e inspeccionar el objeto NSData

    let sample = "Hello there" 
    let data = sample.dataUsingEncoding(NSUTF8StringEncoding) 
    // Put breakpoint here, hover over "data", and press the eye/i 
    
  3. Copiar el hexágono (algo así como <48656c6c 6f207468 657265>) y pegar en el símbolo del navegador

  4. La consola mostrará entonces una cadena: "Hola"

Más recientemente, fue a inspeccionar la salida de NSAttributedString.dataFromRange, el RTFD estaba usando una codificación poco diferente, pero me dio lo que necesitaba :) también es útil para algunos problemas de conversión de JSON, etc.

Buena suerte :)

+0

Esto merece todos los votos al alza –

+0

Thx @CoryImdieke! me alegro de que ayudó :) –