2009-07-10 5 views
5

J'ai vraiment eu du mal à comprendre pourquoi mon appel de service Web est criblé de données indésirables.délégué de NSURLConnection didReceiveData caractères de fin dans les données

J'ai un UITableViewController qui appelle le service Web et agit également comme NSURLConnectionDelegate.

Voici la méthode d'intérêt des délégués, notez les instructions NSLog.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    NSLog(@"data %@", [[NSString alloc] initWithUTF8String: [data bytes]]); 
    NSLog(@"before %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
    [self.rawData appendData:data]; 
    NSLog(@"after %@", [NSString stringWithUTF8String: self.rawData.bytes]); 
} 

Voici le journal résultant après un certain nombre de tentatives:

2009-07-10 09:04:20.339 SundialInvoice[91493:20b] data {"items": [], "request": 

"/inventory/delivered.json"} 
2009-07-10 09:04:20.339 SundialInvoice[91493:20b] before 
2009-07-10 09:04:20.340 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:23.153 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}l 4] [Mes 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] before 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:27.913 SundialInvoice[91493:20b] data (null) 
2009-07-10 09:04:27.913 SundialInvoice[91493:20b] before 
2009-07-10 09:04:27.914 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:30.486 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}ice/1.0 CFN 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] before 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

Où les données de fuite ordures viennent? J'ai couru le service Web avec curl plusieurs fois et la poubelle ne vient pas de lui.

Répondre

6

Je pense que les ordures provient de l'exploitation forestière:

[NSString stringWithUTF8String:self.rawData.bytes] 

Vous dites que vous voulez un NSString de cette chaîne C (= tableau d'octets terminée par zéro). Le problème est que la méthode bytes de NSDatane renvoie pas les données avec un zéro, car il s'agit d'un tableau ordinaire et non d'un C-string. Par conséquent, l'initialiseur NSString saisit même les octets après la fin du NSData reçu, jusqu'à ce qu'il atteigne un octet zéro précédemment stocké en mémoire.

1

les opérations suivantes:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [rawData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"%@",rawData); 
} 

aussi ce que vous avez déclaré rawData comme ???

11

Pour créer un NSString d'un NSData, vous devez utiliser initWithData:encoding:, comme ce qui suit:

NSString *str = [[NSString alloc] initWithData:self.rawData 
             encoding:NSUTF8StringEncoding]; 
NSLog(@"Before: %@", str); 
[str release]; 

traitement NSData octets sous forme de chaîne C pourrait provoquer des failles de sécurité.

Questions connexes