2009-07-10 36 views
5

我真的很難找出爲什麼我的Web服務調用充斥着垃圾數據。NSURLConnection委託didReceiveData數據中的尾隨字符

我有一個UITableViewController調用Web服務,也作爲NSURLConnectionDelegate。

下面是感興趣的委託方法,請注意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]); 
} 

這裏是一個多次嘗試後生成的日誌:

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 

哪裏是哪裏來的尾隨垃圾數據?我已經多次使用curl運行web服務,垃圾不是來自它。

回答

6

我認爲垃圾來自日誌記錄:你說

[NSString stringWithUTF8String:self.rawData.bytes] 

在這裏,你想從這個C-字符串的NSString(=字節數組的零終止)。問題是bytes方法NSData不是返回的數據以0結尾,因爲它是一個普通的數組,而不是一個C字符串。因此,NSString初始化程序甚至可以抓取接收到的NSData結束後的字節,直至達到先前存儲在內存中的某個零字節。

1

嘗試以下操作:

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

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

而且你有什麼聲明RAWDATA爲???

11

要從NSData創建NSString,你應該使用initWithData:encoding:,如下所示:

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

治療NSData字節C字符串可能會導致某些安全漏洞。

相關問題