Ваш ответ может быть UInt8
, но вам не нужно копировать его в UInt8[]
, поскольку он уже есть в CFDataRef
(при условии, что void *
, который вы передаете, действительно равен CFDataRef
, если это не так, у вас есть другие проблемы ...) - CFDataRef
является бесплатной связью с 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];
}