Как преобразовать uint8 [] в строку? - PullRequest
0 голосов
/ 19 апреля 2011

Привет, я работаю над приложением для 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 ]

2 голосов
/ 19 апреля 2011

Ваш ответ может быть 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];
}
1 голос
/ 19 апреля 2011

Вы ищете это?

NSString *string = [[NSString alloc]
    initWithData:(id)data
    encoding:NSUTF8StringEncoding];
0 голосов
/ 19 апреля 2011

Предупреждение появляется, потому что rangeOfString - это метод NSString, а buffer - это не NSString.Я думаю, что было бы лучше, если бы вы могли преобразовать данные в NSString.Я думаю, что это будет работать, если вы попытаетесь использовать stringWithData:

ОБНОВЛЕНИЕ

Просьба проверить это Ссылка

...