0

Я пытаюсь отправить словарь информации с одного iphone на другой iphone через wifi/blutooth, для этого я реализую 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); 
    } 

Receiver сторона

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); 

Но моя проблема заключается в том, как получить обратно тот же словарь. Зачем нужна ошибка в Unarchived time?

+0

1) Какую ошибку вы получаете? 2) Пожалуйста, придерживайтесь соглашений об именах, не начинайте переменные с прописных букв. 3) Не присваивайте объектам переменные, если вы их переписываете немедленно (например, ваш 'UnArchiveDictionary',' [NSMutableDictionary dictionary] 'не нужен (и ключ-unarchiver с ключом даст вам' NSDictionary', а не 'NSMutableDictionary'). – DarkDust

+0

Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «*** - [NSKeyedUnarchiver initForReadingWithData:]: непонятный архив (0x62, 0x70, 0x6c, 0x69, 0x0, 0x0, 0x0, 0x0) ' –

+0

, если u не ум может у объяснить NSKeyedUnarchiver непонятное архивное исключение –

ответ

0

Проблема может быть, что условие:

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

всегда будет ложным. Переменная не может иметь сразу два разных значения. Вы, вероятно, хотите:

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

Так что, если не было (было передано или нет данных) ошибка код будет не заметить, и вместо того, чтобы добавлять мусор байт из стека в ваших изменяемых данных.

Ключ unarchiver затем пытается интерпретировать эти байты мусора в качестве архива и замечает, что это не так, поэтому он генерирует исключение.

+0

k, но я получил данные в стороне получателя .Insted из NSMutableDictionary использовал NSDictionary, а затем ту же ошибку. что NSKeyedUnarchiver непонятное исключение архива, если не возражать, может и explane –

+0

Итак, какое значение делает ' bytesRead' have? (я вижу, что '[длина данных]' регистрируется, но я хочу знать точное значение в 'bytesRead'). – DarkDust

+0

th длина отправки данных и принимаемых данных одинакова. i проверить обе стороны i получил то же значение –

Смежные вопросы