2012-11-14 47 views
0

我有一些意想不到的結果從下面的代碼來:奇怪的NSData輸出

- (NSData *)postDataWithDict:(NSDictionary *)postDict 
{ 
    // Assume key is urlValid 
    NSUInteger postCount = [postDict count]; 
    NSMutableArray *buildArray = [[NSMutableArray alloc] initWithCapacity:postCount]; 
    for (NSString *key in postDict) { 
     //post data is key=value&key=value&key=value... 

     // start with key 
     NSMutableString *arrayLine = [NSMutableString stringWithString:key]; 

     [arrayLine appendString:@"="]; 

     // analyze and then append value 
     id postValue = [postDict objectForKey:key]; 
     if ([postValue isKindOfClass:[NSNumber class]]) { 
      NSString *valueString = [NSString stringWithFormat:@"%@",postValue]; 
      [arrayLine appendString:valueString]; 
     } 
     else if ([postValue isKindOfClass:[NSString class]]) { 
      NSString *urlEncodedString = [self urlEncodeValue:postValue]; 
      [arrayLine appendString:urlEncodedString]; 
     } 
     else { 

      NSLog(@"postKey: %@, postValue class:%@", key, [postValue class]); 
      NSError *jsonError = nil; 
      NSData *jsonData = [NSJSONSerialization dataWithJSONObject:postValue 
                   options:0 
                   error:&jsonError]; 
      if (jsonError != nil) { 
       NSLog(@"JSON serialization failed: %@ - %@", [jsonError localizedDescription], [jsonError userInfo]); 
       NSLog(@"value: %@", postValue); 
      } 
      else { 
       // need to urlencode 
       NSString *stringifyJSON = [NSString stringWithUTF8String:[jsonData bytes]]; 
       NSString *urlJSONstring = [self urlEncodeValue:stringifyJSON]; 
       [arrayLine appendString:urlJSONstring]; 
      } 
     } 
     [buildArray addObject:arrayLine]; 
    } 
    NSString *postString = [buildArray componentsJoinedByString:@"&"]; 
    NSData *postData = [postString dataUsingEncoding:NSUTF8StringEncoding]; 

    //testing 
    NSLog(@"Post Dict: %@", postDict); 
    NSLog(@"Post Array: %@", buildArray); 
    NSLog(@"Post String: %@", postString); 
    NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]); 

    return postData; 
} 

我//測試日誌結果:

Post Dict: { 
    authenticationString = b3210c0bc6d2c47f4c2f7eeea12e063d; 
    dataMode = updateSingle; 
    dateCreated = "374300293.81108"; 
    dateModified = "374609294.313093"; 
    dateSynced = "374610683.588062"; 
    entityName = CommodityTypes; 
    myName = 21; 
    sortKey = 21; 
    username = iPhoneAdamek; 
    usernameString = iPhoneAdamek; 
    uuidKey = "53403EAE-DD4F-4226-A979-316EF7F43991"; 
} 

郵政詞典看起來不錯。正是我想要的。

2012-11-14 13:31:23.640 FoodyU[11393:907] Post Array: (
    "myName=21", 
    "dataMode=updateSingle", 
    "dateSynced=374610683.588062", 
    "uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991", 
    "sortKey=21", 
    "dateModified=374609294.313093", 
    "entityName=CommodityTypes", 
    "dateCreated=374300293.81108", 
    "authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d", 
    "usernameString=iPhoneAdamek", 
    "username=iPhoneAdamek" 
) 

Post Array看起來不錯。字符串全部設置爲連接HTTP POST字符串。

2012-11-14 13:31:23.641 FoodyU[11393:907] Post String: myName=21&dataMode=updateSingle&dateSynced=374610683.588062&uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991&sortKey=21&dateModified=374609294.313093&entityName=CommodityTypes&dateCreated=374300293.81108&authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d&usernameString=iPhoneAdamek&username=iPhoneAdamek 

帖子字符串看起來不錯。我已準備好將其轉換爲[NSMutableURLRequest setHTTPBody:postData]中的數據。

2012-11-14 13:31:23.643 FoodyU[11393:907] Post Data: myName=21&dataMode=updateSingle&dateSynced=374610683.588062&uuidKey=53403EAE-DD4F-4226-A979-316EF7F43991&sortKey=21&dateModified=374609294.313093&entityName=CommodityTypes&dateCreated=374300293.81108&authenticationString=b3210c0bc6d2c47f4c2f7eeea12e063d&usernameString=iPhoneAdamek&username=iPhoneAdamekoneAdamek; 
    usernameString = iPhoneAdamek; 
    uuidKey = "53403EAE-DD4F-4226-A 

WTF ??? &username=iPhoneAdamek怎麼變成&username=iPhoneAdamekoneAdamek; usernameString = iPhoneAdamek; uuidKey = "53403EAE-DD4F-4226-A

我對可可相當陌生。是不是有什麼毛病:

NSData *postData = [postString dataUsingEncoding:NSUTF8StringEncoding]; 

NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]); 
+1

這些行太多沒有錯,清除代碼,只留下相關部分,以便人們可以幫助你。 – Ali

回答

3

你不應該使用的NSDataNSLog

NSLog(@"Post Data: %@", [NSString stringWithUTF8String:[postData bytes]]); 

而是把它作爲,

NSLog(@"Post Data: %@", [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding]); 

[NSString stringWithUTF8String:[postData bytes]]總是返回意外的結果。

documentation for bytes

bytes:返回一個指針接收器的內容。

而作爲每Apple documentation for stringWithUTF8String

stringWithUTF8String: 返回由從UTF8編碼字節的給定的C陣列複製數據產生的字符串。 參數:bytes - UTF8編碼中以NULL結尾的C字節數組。

所以,當你使用[postData bytes],它不是NULL結尾,因此,當您使用的是帶有stringWithUTF8String,直到它遇到一個NULL終止返回寫入內存中的數據。