0

あるiphoneから別のiphoneにwifi/blutoothを介して情報の辞書を送信しようとしています。そのために、CFnetworkとNSNetserviceConceptを実装しています。受信側でデータを受信しました。

私は次のようにコードを作成しました...。

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

しかし、私の問題は、同じ辞書をどのように取り戻すかです。アーカイブされていない時間にエラーが発生するのはなぜですか?

4

1 に答える 1

0

問題は、次の条件である可能性があります。

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

常に false になります。変数は、同時に 2 つの異なる値を持つことはできません。あなたはおそらく欲しい:

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

したがって、エラーが発生した場合 (またはデータが送信されなかった場合)、コードは気付かず、代わりにスタックから可変データにガベージ バイトを追加します。

次に、キー付きアンアーカイバーは、これらのガベージ バイトをアーカイブとして解釈しようとし、そうではないことに気づき、例外をスローします。

于 2011-12-20T12:00:18.540 に答える