2011-04-19 827 views
0

嗨 我正在做一个iPhone应用程序的工作 我收到一些响应服务器在我的缓冲区中的数据类型Uint8 现在我想匹配我的缓冲区与字符串,任何机构可以告诉我我怎么检查它?一段代码被赋予如何将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); 
    } 
} 

任何机构有一些想法? 我会很感激出现

+0

在此行“match = [buffer rangeOfString:search];”这里有一个警告“无效接收器类型”Uint8 [1]'“ – Mashhadi 2011-04-19 06:33:57

回答

2

你的反应可能是UInt8但你并不需要把它复制到UInt8[]因为你已经拥有了它在一个CFDataRef(假设void *你真传是一个CFDataRef,如果不是你有其他问题...) - 一个CFDataRef免费桥接NSData(即你可以从一个到另一个),并且你可以直接从NSData的字节构造一个NSString。您的代码,删除记录,并直接加入的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]; 
} 
+0

哇,这是完美的我是非常感谢你:) – Mashhadi 2011-04-19 11:15:12

0

的警告,因为rangeOfStringNSStringbuffer的方法不是NSString。我认为如果你能把数据转换成NSString会更好。我想如果你尝试使用stringWithData:

UPDATE

请选中该Link

+0

thanx的答复,你可以告诉我一些细节,如何将uint8转换为字符串?如何使用StringWithData:? – Mashhadi 2011-04-19 07:09:30

+0

请检查我的更新回答 – visakh7 2011-04-19 07:14:40

+0

:(没有任何工作 – Mashhadi 2011-04-19 07:32:11

1

您是否在寻找这一点,是否行得通呢?

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

嗯有些事情是这样的 感染我想分配我的Uint8数组中的数据到一个字符串,但我没有得到它 – Mashhadi 2011-04-19 07:31:41

+0

因为你已经有数据作为'NSData'在'data'变量,为什么你不创建字符串? – zoul 2011-04-19 08:39:34

+0

Ahhh哇是多么愚蠢我为什么我不看数据lolzzzz 非常感谢你Zoul :)我知道了 – Mashhadi 2011-04-19 11:07:09