Найдите символьную строку в двоичных данных

Выяснение самых популярных запросов

  • С sys.dm_exec_query_stats, можно выяснить много комбинаций исследований запроса единым запросом.

Ссылка с commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc

8
задан Josh Caswell 5 February 2016 в 01:31
поделиться

3 ответа

Преобразуйте вашу подстроку в объект NSData и выполните поиск этих байтов в большем NSData с использованием rangeOfData: options: range: . Убедитесь, что кодировки строк совпадают!

На iPhone, где это недоступно, вам, возможно, придется сделать это самостоятельно. Функция C strstr () даст вам указатель на первое вхождение шаблона в буфере (если ни один из них не содержит нулей!), Но не индекс. Вот' Функция sa, которая должна выполнить задание (но никаких обещаний, поскольку я не пробовал запустить ее на самом деле ...):

- (NSUInteger)indexOfData:(NSData*)needle inData:(NSData*)haystack
{
    const void* needleBytes = [needle bytes];
    const void* haystackBytes = [haystack bytes];

    // walk the length of the buffer, looking for a byte that matches the start
    // of the pattern; we can skip (|needle|-1) bytes at the end, since we can't
    // have a match that's shorter than needle itself
    for (NSUInteger i=0; i < [haystack length]-[needle length]+1; i++)
    {
        // walk needle's bytes while they still match the bytes of haystack
        // starting at i; if we walk off the end of needle, we found a match
        NSUInteger j=0;
        while (j < [needle length] && needleBytes[j] == haystackBytes[i+j])
        {
            j++;
        }
        if (j == [needle length])
        {
            return i;
        }
    }
    return NSNotFound;
}

Это выполняется в чем-то вроде O (nm), где n - буфер length, а m - размер подстроки. Он написан для работы с NSData по двум причинам: 1) это то, что у вас есть в руках, и 2) эти объекты уже инкапсулируют как фактические байты, так и длину буфера.

14
ответ дан 5 December 2019 в 10:42
поделиться

Если вы используете Snow Leopard, удобный способ - это новый метод -rangeOfData: options: range: в NSData , который возвращает диапазон первого вхождения части данных. В противном случае вы можете получить доступ к содержимому NSData самостоятельно, используя его метод -bytes для выполнения собственного поиска.

1
ответ дан 5 December 2019 в 10:42
поделиться

У меня была такая же проблема. Я решил, что это наоборот, по сравнению с предложениями.

Сначала я переформатирую данные (предположим, что ваши NSData хранятся в var rawFile) с помощью:

NSString *ascii = [[NSString alloc] initWithData:rawFile encoding:NSAsciiStringEncoding];

Теперь вы можете легко выполнять поиск по строкам, например 'abcd' или как хотите, используя класс NSScanner и передавая строку ascii сканеру. Возможно, это не очень эффективно, но работает до тех пор, пока метод -rangeOfData не будет доступен и для iPhone.

1
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: