如何将uint8 []转换为字符串?

时间:2011-04-19 06:31:49

标签: iphone objective-c string client-server uint

您好 我正在开发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);
    }
}

任何人都有一些想法吗? 我会非常感激

3 个答案:

答案 0 :(得分:2)

您的回复可能是UInt8,但您无需将其复制到UInt8[],因为您已在CFDataRef中将其复制(假设您已通过void *真的是一个CFDataRef,如果不是你有其他问题...) - CFDataRefNSData免费联系(即你可以从一个转换为另一个),您可以直接从NSString中的字节构造NSData。您的代码,删除日志记录并添加直接NSString转换:

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表示数据以空值终止;您可以直接使用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];
}

答案 1 :(得分:1)

你在找这个吗?

NSString *string = [[NSString alloc]
    initWithData:(id)data
    encoding:NSUTF8StringEncoding];

答案 2 :(得分:0)

出现警告,因为rangeOfStringNSString的方法而buffer不是NSString。我认为如果你可以将数据转换为NSString会更好。我认为如果您尝试使用stringWithData:

,它会起作用

<强>更新

请检查此Link