Поиск шестнадцатеричной подстроки в строке

Ну, у меня есть сокет, который получает двоичные данные, и я преобразовал эти данные в строку, содержащую значения и строковые значения. (например, "0x04,h,o,m,e,....")

Как я могу найти шестнадцатеричную подстроку в этой строке?

т.е. я хочу найти "0x02,0x00,0x01,0x04".

Я прошу С++ версию python 'fooString.find("\x02\x00\x01\x04")'

Спасибо всем :)


person Ragnagard    schedule 28.09.2009    source источник


Ответы (4)


Хорошая документация по строке находится здесь:
http://www.sgi.com/tech/stl/basic_string.html

Шестнадцатеричные токены передаются точно так же, как Python (как вы думаете, откуда Python взял синтаксис).
Символ \x?? является одиночным шестнадцатеричным символом.

#include <iostream>
#include <string>


int main()
{
    std::cout << (int)'a' << "\n";
    std::string             x("ABCDEFGHIJKLMNOPabcdefghijklmnop");
    std::string::size_type  f   = x.find("\x61\x62");   // ab


    std::cout << x.substr(f);

    // As pointed out by Steve below.
    //
    // The string for find is a C-String and thus putting a \0x00 in the middle
    // May cause problems. To get around this you need to use a C++ std::string
    // as the value to find (as these can contain the null character.
    // But you run into the problem of constructing a std::string with a null
    //
    // std::string  find("\0x61\0x00\0x62"); // FAIL the string is treated like a C-String when constructing find.
    // std::string  find("\0x61\0x00\0x62",3); // GOOD. Treated like an array.

    std::string::size_type f2 = x.find(std::string("\0x61\0x00\0x62",3));
}
person Martin York    schedule 28.09.2009
comment
Единственная незначительная проблема здесь заключается в создании экземпляра std::string, который включает нулевой символ, для примера строки Ragnagards. Для этого вам понадобится конструктор std::string, который принимает массив символов и длину... size_t pos = fooString.find(std::string (\x02\x00\x01\x04, 4)); - person Steve314; 28.09.2009

В объекте String С++ есть много вариантов поиска, например

find Поиск содержимого в строке (открытая функция-член)

rfind Найти последнее вхождение содержимого в строку (открытая функция-член)

find_first_of Поиск символа в строке (открытая функция-член)

find_last_of Поиск символа в строке с конца (открытая функция-член)

find_first_not_of Найти отсутствие символа в строке

find_last_not_of Найти отсутствие символа в строке с конца (открытая функция-член)

http://www.cplusplus.com/reference/string/string/

Перейдите по ссылке выше и посмотрите, что вам подходит

person Satbir    schedule 28.09.2009
comment
Поиск почти полностью соответствует моим потребностям, но как я могу превратить список шестнадцатеричных значений в строку, чтобы передать ее в качестве параметра для поиска? Благодарность - person Ragnagard; 28.09.2009
comment
используйте stringstream для создания вашего входного параметра - person Satbir; 28.09.2009
comment
а что касается строки, которую вы ищете, используйте тот же синтаксис, что и в Python: string sSearchPattern = \x02\x00\x01\x04; (обратите внимание, что строки python больше похожи на строки C++, чем строки c. Последние заканчиваются нулем и, следовательно, не могут содержать нулевой символ в самой строке. - person mjv; 28.09.2009

Возможно, вы можете попробовать strstr() или аналогичную функцию. Или вы можете использовать что-то вроде strtok, чтобы получить значения между вашими разделителями и расшифруй сам.

person John D.    schedule 28.09.2009
comment
Проблема в том, что strstr() и другие строковые функции c работают со строками c, которые завершаются нулем, и поэтому не работают с образцом строки поиска OP. - person mjv; 28.09.2009
comment
Он сказал, что извлекает данные из своего потока в строку, в которой он хотел выполнить поиск. Я предположил, что он был нулевым завершением, когда он сделал это преобразование. - person John D.; 28.09.2009
comment
strtok() — плохая идея, поскольку она изменяет базовые данные, чтобы отслеживать свое текущее местоположение. - person Martin York; 28.09.2009
comment
@John D. Проблема не столько в добавлении нулевого терминатора к строке, сколько в том факте, что строка для поиска представляет собой двоичную строку, которая имеет 0x00 во второй позиции, а ввод также является двоичным и может включать нули в любом месте строки. Такие строки не могут быть обработаны строками в стиле c (и, следовательно, с помощью strstr()), вам нужна строка C++::, которая затем может выполнить необходимую задачу с помощью различных методов поиска этого класса. - person mjv; 28.09.2009

Попробуйте что-то вроде этого:

char find[] = {0x02, 0x04, 0x04, 0x00};
int pos = strstr(inputStr, find);

Просто помните, что 0x00 — это null, то есть конец строки. Поэтому, если ваш источник или ваш поиск содержат их, вы не найдете то, что ищете, потому что strstr остановится на первом нулевом значении.

person keick    schedule 28.09.2009