Создать строку из набора 8 байт с экранированием?

 
0
 
C++
ava
EvilsInterrupt | 21.03.2013, 12:15
Как наиболее простым способом создать строку из 8 байт с экранированием non-ascii символов?

Пока на ум приходит только применение std::transform в таком виде:


std::string result;

char * src; // 02 03 41 99 33

std::transform( src, src+8,
  std::back_inserter(result),
  &my_specific_function);


Поясню:
Мне хочется получить строку в Python-подобном виде. В версии питона 3.x появился тип bytes , так вот когда его преобразовываешь в строку банальным str(your_bytes_array) можешь получить строку с экранированными не аски символами,пример: '\x02\x03a\x993' .
Kommentare (9)
ava
volatile | 21.03.2013, 18:53 #
EvilsInterrupt, врядли это самый простой, но работать должен  smile 

std::string
escape_seq (const char * text)
{
   std::string res;
   unsigned char c;
   while (c = *text ++)
   {
      if (isascii (c) && isprint (c))
         res += c;
      else
      {
         char buf [16];
         sprintf (buf, "\\x%02x", c);
         res += buf;
      }
   }
   return res;
}


*для страдающих ООП головного мозга, часть с принтфом можно заменить на слующую:

std::stringstream str;
str << "\\x"<<  std::hex  << std::setw(2) << std::setfill('0') << int(c);
res += str.str();
ava
EvilsInterrupt | 21.03.2013, 21:50 #
volatile,
Ты не совсем понял мою задачу ;) Поясню на Python:

>>> abc = b'\x00simple\x98\06string'
>>> abc
b'\x00simple\x98\x06string'
>>> s = str(abc)
>>> s
"b'\\x00simple\\x98\\x06string'"

в переменной abc хранится набор байтов. Надо из них получить подобную строку, которая представлена в переменной s. Если приглядишься, то аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются!
ava
feodorv | 21.03.2013, 23:16 #
Цитата (EvilsInterrupt @  21.3.2013,  22:50 findReferencedText)
Если приглядишься, то аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются!

Как бэ
Цитата (volatile @  21.3.2013,  19:53 findReferencedText)
   if (isascii( c ) && isprint( c ))

В чем проблема?
ava
volatile | 21.03.2013, 23:20 #
Цитата (EvilsInterrupt @  21.3.2013,  21:50 findReferencedText)
аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются

имхо, именно это и делает моя функция
http://codepad.org/sYJvjmLp

так что действительно кто-то из нас не понял другого...

ava
EvilsInterrupt | 21.03.2013, 23:23 #
volatile,
Ты прав! ;) Извини за наезд, хотя он им не был, но мог показаться таковым ;)
ava
volatile | 21.03.2013, 23:32 #
Цитата (EvilsInterrupt @  21.3.2013,  23:23 findReferencedText)
Извини за наезд

да ничо, бывает.
я работаю иногда с третьим пайтоном, поэтому вобщем-то понял что вы хотите...
ava
EvilsInterrupt | 22.03.2013, 00:16 #
volatile, Спасибо. Вопрос исчерпан
ava
EvilsInterrupt | 22.03.2013, 09:21 #
volatile,
А как бы ты такой тип форматирования назвал? Я к тому, что если бы я знал правильное название такого форматирования, то мог бы поискать в гугле. Мои запросы в гугл приводили к ненужному без результату )
ava
volatile | 22.03.2013, 11:50 #
Цитата (EvilsInterrupt @  22.3.2013,  09:21 findReferencedText)
 как бы ты такой тип форматирования назвал?


EvilsInterrupt, вот это моё больное место.  smile 
мне трудно правильно назвать сразу. (вобще, постоянно придумывать названия, имхо это самое трудное в программировании  smile)
правильно данное имя - это удача, повышающая читабельность кода.

насчет такого типа форматирования, иногда называют его, вроде бы, искейп-последовательностями.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden