1

こんにちは、iPhone アプリケーションの作業を行っています。データ型 Uint8 のサーバーの応答をバッファに取得しています。バッファを文字列と一致させたいのですが、どのように確認すればよいか教えてもらえますか? コードの一部が与えられます

void receiveData(CFSocketRef s, CFSocketCallBackType type,  CFDataRef address, const void *data, void *info)
{

    CFDataRef df = (CFDataRef) data;
    int len = CFDataGetLength(df);
    if(len <= 0) return;

    CFRange range = CFRangeMake(0,len);
    UInt8 buffer[len];
    NSLog(@"Received %d bytes from socket %d\n", 
          len, CFSocketGetNative(s));
    CFDataGetBytes(df, range, buffer);
    NSLog(@"Client received: %s\n", buffer); 

    NSLog(@"As UInt8 coding: %@", df);
    [mTextViewAlias setText:[NSString stringWithUTF8String: buffer]];
    ////////////.............////////////
    LoginViewController *lvc = [[LoginViewController alloc] init];

    NSString *search = @"ACPT";

    NSRange match;

    match = [buffer rangeOfString: search];

    if (match.location == NSNotFound)
        NSLog (@"Invalid Username Or Password");
    else
    {
        [lvc goToWatchList];

        NSLog (@"match found at index %i", match.location);
    }
}

体は何か考えがありますか?とても感謝しています

4

3 に答える 3

3

あなたの応答は かもしれませんが、すでにa にあるので、UInt8それを a にコピーする必要はありません(渡したものが本当に aであると仮定すると、そうでない場合は他の問題があります...) - aは toll-フリー ブリッジ(つまり、一方から他方へのキャストが可能) であり、 内のバイトから直接 を構築できます。ログを削除し、直接 NSString 変換を追加するコード:UInt8[]CFDataRefvoid *CFDataRefCFDataRefNSDataNSStringNSData

void receiveData(CFSocketRef s, CFSocketCallBackType type,  CFDataRef address, const void *data, void *info)
{
    LoginViewController *lvc = [[LoginViewController alloc] init];

    NSString *buffer = [[NSString alloc] initWithData:(NSData *)data
                                             encoding:NSUTF8StringEncoding];
    NSRange match = [buffer rangeOfString:@"ACPT"];
    [buffer release];

    if (match.location == NSNotFound)
        NSLog (@"Invalid Username Or Password");
    else
        [lvc goToWatchList];
}

または、少なくともサンプルコードでは、変換されたバッファを保存していない、検索にリテラル文字列を使用している、および の使用は%s、データが null で終了していることを意味します。中間オブジェクトを作成せずに、これらすべてを C 関数で直接行うことができます。

void receiveData(CFSocketRef s, CFSocketCallBackType type,  CFDataRef address, const void *data, void *info)
{
    LoginViewController *lvc = [[LoginViewController alloc] init];

    char *buffer = (char *)CFDataGetBytePtr((CFDataRef)data);

    if (strstr(buffer, "ACPT") == NULL)
        NSLog (@"Invalid Username Or Password");
    else
        [lvc goToWatchList];
}
于 2011-04-19T10:37:12.427 に答える
1

これを探していますか?

NSString *string = [[NSString alloc]
    initWithData:(id)data
    encoding:NSUTF8StringEncoding];
于 2011-04-19T07:18:21.407 に答える
0

rangeOfStringはのメソッドでNSStringあり、でbufferはないため、警告が表示されますNSString。データをNSStringに変換できればもっと良いと思います。使ってみればうまくいくと思いますstringWithData:

アップデート

plsはこのリンクをチェックしてください

于 2011-04-19T06:42:49.567 に答える