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

您的回答可能是UInt8,但您不需要将它复制到 aUInt8[]中,因为您已经在 a 中拥有它CFDataRef(假设void *您传入的确实是 a CFDataRef,如果不是,您还有其他问题......) - aCFDataRef是收费-自由桥接NSData(即您可以从一个转换到另一个),并且您可以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];
}
于 2011-04-19T10:37:12.427 回答
1

你在找这个吗?

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

出现警告是因为rangeOfString它是一种方法,NSStringbuffer不是NSString. 我认为如果您可以将数据转换为 NSString 会更好。我认为如果您尝试使用它会起作用stringWithData:

更新

请检查此链接

于 2011-04-19T06:42:49.567 回答