Получение ошибки при распаковке NSMutableDictionary или NSData?

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

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

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

            }
        }

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

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

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


person Musthafa P P    schedule 20.12.2011    source источник
comment
1) Какую ошибку вы получаете? 2) Пожалуйста, придерживайтесь соглашений об именах, не начинайте переменные с заглавных букв. 3) Не назначайте объекты переменным, если вы сразу перезаписываете их (как и ваш UnArchiveDictionary, [NSMutableDictionary dictionary] не нужен (и разархиватор с ключом даст вам NSDictionary, а не NSMutableDictionary).   -  person DarkDust    schedule 20.12.2011
comment
Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «*** -[NSKeyedUnarchiver initForReadingWithData:]: непонятный архив (0x62, 0x70, 0x6c, 0x69, 0x0, 0x0, 0x0, 0x0)»   -  person Musthafa P P    schedule 20.12.2011
comment
если вы не возражаете, можете ли вы объяснить NSKeyedUnarchiver непонятное исключение архива   -  person Musthafa P P    schedule 20.12.2011


Ответы (1)


Проблема может заключаться в том, что условие:

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

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

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

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

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

person DarkDust    schedule 20.12.2011
comment
k, но я получил данные на стороне получателя. Вместо NSMutableDictionary использовал NSDictionary, а затем ту же ошибку. какое NSKeyedUnarchiver непонятное исключение архива, если не возражаете, можете объяснить - person Musthafa P P; 20.12.2011
comment
Итак, какое значение имеет bytesRead? (Я вижу, что [data length] регистрируется, но я хочу знать точное значение в bytesRead). - person DarkDust; 20.12.2011
comment
длина отправки данных и получения данных одинакова. я проверяю обе стороны, я получил одинаковое значение - person Musthafa P P; 20.12.2011
comment
NSInteger bytesRead; буфер uint8_t[64]; NSMutableData *data=[[данные NSMutableData]retain]; bytesRead=[_inStream read:buffer maxLength:sizeof(buffer)]; if (bytesRead==-1|| bytesRead==0) { NSLog(@_inStream Error...................); } else { [данные appendBytes:длина буфера:bytesRead]; NSLog(@Data Received имеет длину:%d\n\n,[длина данных]); NSString *text=[[NSString alloc]initWithData:кодирование данных:NSUTF8StringEncoding]; NSLog(@привет......................%@,текст); - person Musthafa P P; 20.12.2011
comment
я получил такое же значение, поэтому я сомневаюсь, зачем снова преобразовывать данные в строку NSString *text=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; - person Musthafa P P; 20.12.2011