2009-09-28 4 views
1

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

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

I.e. Я хочу найти «0x02,0x00,0x01,0x04».

Я прошу C++ версии питона 'fooString.find ("\ x02 \ x00 \ x01 \ x04")'

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

ответ

3

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

Hex лексемы передаются так же, как 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)); 
} 
+0

Единственная незначительная проблема здесь заключается в создании экземпляра std :: string, который включает в себя нулевой символ, для строки примера Ragnagards. Для этого вам нужен конструктор std :: string, который принимает массив символов и длину ... size_t pos = fooString.find (std :: string ("\ x02 \ x00 \ x01 \ x04 ", 4)); – Steve314

+0

ваши ответы заполняют мою просьбу, спасибо вам: D – Ragnagard

0

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

+0

Проблема заключается в том, что str str() и другие c-строковые функции работают с c-строками, которые завершены nul и поэтому не работают с образцовой строкой поиска OP. – mjv

+0

Он сказал, что он вытаскивал данные из своего потока в строку, в которой он хотел поискать. Я предположил, что он был неокончательным, когда он сделал это обращение. –

+0

strtok() - плохая идея, так как она модифицировала базовые данные, чтобы отслеживать текущее местоположение. –

2

Есть много вариантов поиска в C++ объекта строкового Как

найти Найти содержание в строке (функция общественного члена)

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

find_first_of поиск символов в строке (функция общественного элемента)

find_last_of Find символа в строке с конца (функция общественного члена)

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

find_last_not_of Find отсутствие символа в строке с конца (функция общественного члена)

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

Перейти к вышеуказанной ссылке и посмотреть, какой костюм с вы

+0

Найти почти совпадение с моими потребностями, но как я могу превратить список шестнадцатеричных значений в строку, чтобы передать ее как параметр «найти»? спасибо – Ragnagard

+0

используйте stringstream для создания вашего входного параметра – Satbir

+0

, а для строки, которую вы ищите, используйте тот же синтаксис, что и в Python: string sSearchPattern = "\ x02 \ x00 \ x01 \ x04"; (обратите внимание, что строки python более похожи на строки C++, чем строки c. Последние имеют nul-terminated и, следовательно, не могут содержать нулевой символ внутри собственно строки. – mjv

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^