0

我想通過wifi/blutooth從一個iphone發送信息字典到另一個iphone,爲此我實現了CFnetwork和NSNetservice Concept.I在Reciver端收到數據。UnArchived獲取錯誤NSMutableDictionary o NSData?

我沒有代碼如下....

**Sender Side** 

samDict=[NSMutableDictionary dictionary]; 
    [samDict setObject:@"Muhammed Musthafa" forKey:@"PP"]; 
    [samDict setObject:@"John P" forKey:@"Jose"]; 
    [samDict setObject:@"Lubaba" forKey:@"P"]; 
    [samDict setObject:@"JINI" forKey:@"KS"]; 
    [samDict setObject:@"Anusha" forKey:@"GS"]; 
    [samDict setObject:@"Athulya" forKey:@"V"]; 
    [samDict setObject:@"Riyas" forKey:@"MM"]; 
    [samDict setObject:@"Raihanath" forKey:@"MH"]; 
    [samDict setObject:@"Shabeer" forKey:@"poola"]; 
    [samDict setObject:@"Rajisha" forKey:@"Raji"]; 

    //NSLog(@" Dictionary values.............%@",samDict); 

    NSMutableData *ArchiveData=[[NSMutableData alloc]init];  
    NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:ArchiveData]; 
    [archiver setOutputFormat: NSPropertyListXMLFormat_v1_0]; 

    [archiver encodeObject:self.samDict forKey:@"Some Key Values"]; 
    [archiver finishEncoding];  
    [archiver release]; 

    const uint8_t *buffer=(const uint8_t *)[ArchiveData bytes]; 
    NSInteger nWrtitten=[_outStream write:buffer maxLength:[ArchiveData legth]]; 
    if (!nWrtitten) 
    { 
     NSLog(@"Eorror writting to Stream %@ : %@", _outStream, [_outStream streamError]); 
    } 
    else 
    { 

     NSLog(@" Write %ld bytes to Stream %@",(long)nWrtitten, _outStream); 
    } 

接收機側

NSInteger bytesRead; 
     uint8_t buffer[13000]; 
     NSMutableData *data=[[NSMutableData data]retain];   

     if (stream==_inStream) 
     { 


      bytesRead=[_inStream read:buffer maxLength:sizeof(buffer)]; 
      if (bytesRead==-1&& bytesRead==0) 
      { 
       NSLog(@"_inStream Error..................."); 
      } 
      else 
      {          
       [data appendBytes:buffer length:bytesRead]; 
       NSLog(@"Data Received has length :%d\n\n",[data length]); 

       NSLog(@"data............%@",data); 

      } 
     } 

我在接收機Side.that得到數據是以字節爲單位的格式。 side.if我試圖未歸檔這解釋格式這樣

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    NSMutableDictionary* UnArchiveDictionary =[NSMutableDictionary dictionary]; 
    UnArchiveDictionary = [[unarchiver decodeObjectForKey:@"Some Key Values"] retain]; 
    NSLog(@"UnArchive Dictionary %@",UnArchiveDictionary); 

但不幸的是ican't未存檔此數據字典格式,我不能解除存檔在接收這個數據。我收到線NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

的錯誤我已經找到了在轉換字節的數據一些代碼字符串格式這樣

size_t length=[data length]; 
        unsigned char aBuffer[length]; 
        [data getBytes:aBuffer length:length]; 
        aBuffer[length - 1]=0; 
        NSString *messageString =aBuffer; 

        NSLog (@"%s",messageString); 

但我的問題是如何得到相同的字典。爲什麼在未歸檔時間出錯?

+0

1)你得到什麼錯誤? 2)請遵守命名約定,不要用大寫字母開始變量。 3)如果你立即覆蓋變量,不要將對象賦值給變量(比如你的'UnArchiveDictionary','[NSMutableDictionary dictionary]'是不必要的(而鍵控的unarchiver會給你一個'NSDictionary',而不是'NSMutableDictionary')。 – DarkDust 2011-12-20 11:44:47

+0

由於未捕獲的異常'NSInvalidArgumentException'而終止應用,原因:'*** - [NSKeyedUnarchiver initForReadingWithData:]:不可理解的歸檔(0x62,0x70,0x6c,0x69,0x0,0x0,0x0,0x0)' – 2011-12-20 11:50:28

+0

如果你不心理可以解釋NSKeyedUnarchiver難以理解的檔案異常 – 2011-12-20 11:55:33

回答

0

的問題可能是以下條件:

if (bytesRead==-1&& bytesRead==0) 

將永遠是假的。變量一次不能有兩個不同的值。你可能想:

if (bytesRead==-1 || bytesRead==0) 

所以,如果有錯誤(或沒有數據被傳送),您的代碼會沒有注意到,而是從堆棧到您的可變數據追加垃圾字節。

鍵控的unarchiver然後嘗試將這些垃圾字節解釋爲檔案並注意到它不是,所以它會引發異常。

+0

K,但我在接收端的數據.insted NSMutableDictionary使用NSDictionary然後也是相同的錯誤。什麼NSKeyedUnarchiver不能理解的檔案異常如果不介意可以解釋 – 2011-12-20 12:13:49

+0

那麼,什麼值' bytesRead'有?(我看到'[data length]'被記錄了,但我想知道'bytesRead'中的確切值)。 – DarkDust 2011-12-20 12:19:23

+0

th發送數據和接收數據的長度是相同的。我檢查雙方我有相同的值 – 2011-12-20 12:22:31