50 votes

Impression de NSData à l'aide de NSLog

Comment puis-je imprimer le contenu d'un objet NSData en utilisant 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

}

Je voudrais imprimer le contenu de *returnData...

80voto

iMOBDEV Points 2086

Conversion de NSData en NSString à l'aide de

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

et imprimer NSString dans NSLog comme ci-dessous

NSLog(@"%@",strData);

Cette réponse est éditée pour JeremyP, car il ne sait pas comment savoir si le contenu est en UTF-8, bien que ce ne soit pas une discussion de cette question.

Vous pouvez obtenir l'en-tête de réponse dans la méthode déléguée suivante

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

Ce dictionnaire vous donnera toutes les informations sur l'en-tête comme ci-dessous

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

Vérifiez charset="utf-8", vous obtiendrez l'encodage à partir de là.

60voto

JeremyP Points 46808

Si vous faites ça :

NSLog(@"%@", returnData); 

Les NSData seront enregistrées au format hexadécimal. Je pense que c'est probablement ce que vous recherchez.

Si vous voulez le transformer en une chaîne de caractères et enregistrer cette dernière, vous devez d'abord déterminer le jeu de caractères utilisé. Le jeu de caractères par défaut pour HTTP n'est pas UTF-8, mais ISO-8859-1. . Une façon de le faire est d'examiner les Content-Type pour la section charset.

4voto

Vous devez également tenir compte d'une chose :

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

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

J'espère pouvoir vous aider !

4voto

Leonard Pauli Points 1096

Je souhaite assez souvent voir ce que les NSData représentent réellement. En général, il s'agit d'une sorte de texte, ce qui rend l'hexagone peu pratique. C'est pourquoi j'écris généralement cet extrait dans la console JavaScript de mon navigateur Web. Il fonctionne assez rapidement et peut être modifié facilement si l'on souhaite poursuivre le traitement.

  1. Copiez/collez le script suivant dans la console de votre navigateur (clic droit ici -> Inspecter l'élément), appuyez sur entrée

    (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. Exécutez votre code swift/obj-c, placez un point d'arrêt et inspectez votre objet NSData.

    let sample = "Hello there"
    let data = sample.dataUsingEncoding(NSUTF8StringEncoding)
    // Put breakpoint here, hover over "data", and press the eye/i
  3. Copiez l'hexagone (quelque chose comme <48656c6c 6f207468 657265> ) et coller dans l'invite du navigateur

  4. La console affichera alors une chaîne de caractères : "Bonjour à tous"

Plus récemment, c'était pour inspecter la sortie de NSAttributedString.dataFromRange le rtfd utilisait un encodage un peu différent, mais j'ai obtenu ce dont j'avais besoin :) Également utile pour certains problèmes de conversion json, etc.

Bonne chance :)

1voto

Shady Points 1254

Cochez cette réponse si vous souhaitez que vos octets de données soient des chaînes de caractères.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X