Получение ошибки, когда UnArchived NSMutableDictionary o NSData? - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь отправить словарь информации с одного iphone на другой iphone через wifi / blutooth, для этого я реализую CFnetwork и NSNetservice Concept. Я получил данные на стороне получателя.

Я сделал код следующим образом ....

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

            }
        }

Я получил данные в Receiver Side.this в байтовом формате. Я не могу разархивировать эти данные на стороне получателя. Если я пытаюсь разархивировать их в формат словаря, как этот

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

Но, к сожалению, не удалось разархивировать эти данные в формате словаря. Я получаю сообщение об ошибке линии 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);

Но моя проблема в том, как вернуть тот же словарь. Почему ошибка в неархивированном времени?

1 Ответ

0 голосов
/ 20 декабря 2011

Возможно, проблема в том, что условие:

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

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

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

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

* 1008Разархивированный ключ затем пытается интерпретировать эти байты мусора как архив и замечает, что это не так, поэтому он выдает исключение.
...