0

我正在尝试通过 wifi/蓝牙将信息字典从一部 iphone 发送到另一部 iphone,为此我实现了 CFnetwork 和 NSNetservice 概念。我在 Reciver 端收到了数据。

我做了如下代码....

**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.that 中获得了字节格式的数据。我无法在 Receiver 端取消存档此数据。如果我试图将其取消存档为这样的字典格式

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

但我的问题是如何取回同一个字典。为什么在未归档时间出现错误?

4

1 回答 1

0

问题可能是条件:

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

永远是假的。一个变量不能同时有两个不同的值。你可能想要:

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

因此,如果出现错误(或未传输数据),您的代码不会注意到,而是将堆栈中的垃圾字节附加到可变数据中。

然后,键控取消归档程序尝试将这些垃圾字节解释为归档并注意到它不是,因此它抛出异常。

于 2011-12-20T12:00:18.540 回答