Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать строку из набора 8 байт с экранированием? Хочу экранировать не аски символы 
V
    Опции темы
EvilsInterrupt
Дата 21.3.2013, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Как наиболее простым способом создать строку из 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' .

PM MAIL WWW ICQ Jabber   Вверх
volatile
Дата 21.3.2013, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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();


Добавлено через 7 минут и 52 секунды
Еще вариант
Код

struct ascii
{
   ascii (std::string & res)
   :  res(res)
      {}
   void operator () (unsigned char c)
   {
      if (isascii (c) && isprint (c))
         res += c;
      else
      {
         std::stringstream str;
         str << "\\x"<<  std::hex  << std::setw(2) << std::setfill('0') << int(c);
         res += str.str();
      }
   }
   std::string & res;
};

с последней работать как-то так:
Код

std::string src  = "TEST: \x01\x02\n\r\tOKx21";
std::string res;
std::for_each (src.begin(), src.end(), ascii(res));
std::cout << res << std::endl;


PM MAIL   Вверх
EvilsInterrupt
Дата 21.3.2013, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



volatile, 
Ты не совсем понял мою задачу ;) Поясню на Python:
Код

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

в переменной abc хранится набор байтов. Надо из них получить подобную строку, которая представлена в переменной s. Если приглядишься, то аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются!
PM MAIL WWW ICQ Jabber   Вверх
feodorv
Дата 21.3.2013, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(EvilsInterrupt @  21.3.2013,  22:50 Найти цитируемый пост)
Если приглядишься, то аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются!

Как бэ
Цитата(volatile @  21.3.2013,  19:53 Найти цитируемый пост)
      if (isascii( c ) && isprint( c ))

В чем проблема? Дополнительно экранировать '\'?

Это сообщение отредактировал(а) feodorv - 21.3.2013, 23:19


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 21.3.2013, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(EvilsInterrupt @  21.3.2013,  21:50 Найти цитируемый пост)
аски-символы выводятся в привычном аски представлении, а вот те что не аски экранируются

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

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


PM MAIL   Вверх
EvilsInterrupt
Дата 21.3.2013, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



volatile, 
Ты прав! ;) Извини за наезд, хотя он им не был, но мог показаться таковым ;)
PM MAIL WWW ICQ Jabber   Вверх
volatile
Дата 21.3.2013, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(EvilsInterrupt @  21.3.2013,  23:23 Найти цитируемый пост)
Извини за наезд

да ничо, бывает.
я работаю иногда с третьим пайтоном, поэтому вобщем-то понял что вы хотите...

PM MAIL   Вверх
EvilsInterrupt
Дата 22.3.2013, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



volatile, Спасибо. Вопрос исчерпан
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 22.3.2013, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



volatile, 
А как бы ты такой тип форматирования назвал? Я к тому, что если бы я знал правильное название такого форматирования, то мог бы поискать в гугле. Мои запросы в гугл приводили к ненужному без результату )
PM MAIL WWW ICQ Jabber   Вверх
volatile
Дата 22.3.2013, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(EvilsInterrupt @  22.3.2013,  09:21 Найти цитируемый пост)
 как бы ты такой тип форматирования назвал?


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

насчет такого типа форматирования, иногда называют его, вроде бы, искейп-последовательностями.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.