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 шт):
Можно сделать что-то наподобие этого:
std::stringstream strStream;
strStream <<std::hex << (short)result[0];
Memo1->Lines->Add(string(strStream.str());
strStream.str("");
Здесь мы создаем поток, в него сохраняем значение в 16-тиричном виде, затем на основе содержимого потока создаем строку, которую добавляем в Memo
и чистим поток перед заходом на следующую итерацию.
P.S. #include <sstream>
Преобразовать выбранные 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;
}