C++ как вывести строку smatch в hex

regex reg("регулярка");
smatch result;

    ifstream f("c:\\data.html");
    int found = 0;
    while (!f.eof()) {

        string s;
        getline(f, s);
        string::const_iterator sStart = s.begin();
        string::const_iterator sEnd = s.end();
        while (regex_search(sStart, sEnd, result, reg)) {

Memo1->Lines->Add(string(result[0]).c_str());
            sStart = result[0].second;
        }
    }

вывожу найденные по регуляркам строки в Memo

Вопрос как вывести в Memo найденные значения, но в hex (без доп. символов) Например, нашел по регулярке в файле строку main и хочу, чтоб в Memo отобразилось 6D61696E

У меня получилось сначала записать результат строки из Memo в Edit, а затем вот так

Label1->Caption = "";
  for (int i = 1; i <= Edit1->Text.Length(); i++)
  {
      Label1->Caption = Label1->Caption + IntToHex(Byte(Edit1->Text[i]),2) + ' ';
}

а затем обратно вывести в Memo строку из Label

НО при таком варианте, в случае, если символы нечитаемые, то после записи строки из Memo в label и потом обратно побайтно в hex - значение байта может измениться, так как кодировка левая

Так вот мне бы хотелось отобразить в Memo строку в hex, чтоб символы не искажались например когда поиск производится не по словам, а по байтам, типа регулярки \xC4\xC9\xB0 или когда смешанный поиск и слово и после него \xC4\xC9\xB0 то есть хочется считывать с result[0] сразу в Memo в шестнадцатеричном виде без искажения. желательно с примером


Ответы (2 шт):

Автор решения: Alexey Vesker

Можно сделать что-то наподобие этого:

std::stringstream strStream;
strStream <<std::hex << (short)result[0];
Memo1->Lines->Add(string(strStream.str());
strStream.str("");

Здесь мы создаем поток, в него сохраняем значение в 16-тиричном виде, затем на основе содержимого потока создаем строку, которую добавляем в Memo и чистим поток перед заходом на следующую итерацию.

P.S. #include <sstream>

→ Ссылка
Автор решения: avp

Преобразовать выбранные regexp-ом символы строки в их шестнадцатиричные коды и запомнить их в буфере для последующей обработки можно, например, так:

while (regex_search(sStart, sEnd, result, reg)) {
  
  {
    unsigned char uc;
    const char *p = &(result.str()[0]);
    int l = result.str().size();
    char buf[2 * l + 1];
    l = 0;
    while ((uc = *p++)) {
      buf[l++] = "0123456789abcdef"[uc >> 4];    // старший hex
      buf[l++] = "0123456789abcdef"[uc & 0xf];   // младший hex в байте
    }
    buf[l] = 0;
    printf("buf = %s\n", buf);
    //      Memo1->Lines->Add(buf);
  }
  
  sStart = result[0].second;

}
→ Ссылка