LINUX.ORG.RU

вопрос про ostream_iterator

 


0

1

Всем привет!

Вопрос следующий. Пытаюсь с помощью ostringstream и ostream_iterator распечатать вектор в hexe.

void Vector2Hex( std::vector<unsigned char>& payload ) {

		std::ostringstream oss;
	
		oss.setf ( std::ios::hex , std::ios::basefield );
		oss.setf ( std::ios::showbase );

		std::ostream_iterator<short> out( oss, " " );
		std::copy( payload.begin(), payload.end(), out );

		std::cout << oss.str() << std::endl ;
	}
Столкнулся с тем, что ostream_iterator<short> с типом short, int работает нормально(т.е. печать идет в хексе), а вот когда определяю тип итератора как std::ostream_iterator<unsigned char> - то хекс не отрабатывает, выводятся просто символы.
std::ostream_iterator<unsigned char> out( oss, " " );

Подскажите и объясните почему так? оператор << вроде определн для всех типов.



Последнее исправление: kabanchik (всего исправлений: 1)
Ответ на: комментарий от kabanchik

Потому что это обычный typedef, в основе которого лежит тот же самый char. Ты же сам написал, что с int всё работает, что тебе ещё нужно?

Gvidon ★★★★
()
Ответ на: комментарий от kabanchik

Потому что вывод типа char обрабатывается особым образом, не так как вывод других числовых типов. Ты ещё про vector<bool> спроси

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от kabanchik

Пардон за дезинформацию. А зачем тебе нужен unsigned char в шаблоне ostream_iterator? Этот тип показывает только формат вывода, а не размерность чего-либо. Вектор <char> можно без проблем вывести через ostream_iterator<int>.

E ★★★
()
Ответ на: комментарий от E

да, так и есть. просто интересно стало на счет unsigned char в ostream_iterator

kabanchik
() автор топика
Ответ на: комментарий от kabanchik

То же самое и с unsigned char. В стандарте не оговаривается, является ли char знаковым или беззнаковым типом, так что они вообще вполне могут совпадать

Gvidon ★★★★
()
Ответ на: комментарий от kabanchik

символы в хексе теперь представить нельзя?!

можно, только скастуй их во что-то побольше. И выводи только 2 цифры.

emulek
()
Ответ на: комментарий от Gvidon

То же самое и с unsigned char. В стандарте не оговаривается, является ли char знаковым или беззнаковым типом

что за бред ты пишешь?

unsigned == беззнаковый.

они вообще вполне могут совпадать

могут. Если нет знакового. И даже совпадают в x86 например. 'я'==-1 к примеру в cp866.

emulek
()
Ответ на: комментарий от emulek

так вопрос то как раз в том, почему кастовать char надо во что то большее? почему ostream итератору нельзя сказать, что рассматривай unsigned char( да даже, просто char ) как число?

kabanchik
() автор топика
Ответ на: комментарий от emulek

что за бред ты пишешь?

Ткни меня носом в пункт стандарта, где написано, является char знаковым или беззнаковым. Или пнх

Gvidon ★★★★
()
Ответ на: комментарий от kabanchik

ведет так же, как и char и int8_t:

знаковость тут совсем не при чём. Char это традиционно символ. Вот твой boost его и воспринимает как символ. Хотя формально это число.

Ты не путай традиции и формальности. Формально 'ф' это константа, которая имеет тип int, и значение, причём отрицательное. Но по традиции мы это считаем символом.

emulek
()
Ответ на: комментарий от kabanchik

почему ostream итератору нельзя сказать, что рассматривай unsigned char( да даже, просто char ) как число?

гугли в словаре слово char. А потом думай, что говоришь.

Ткни меня носом в пункт стандарта, где написано, является char знаковым или беззнаковым. Или пнх

а ты гугли значение unsigned и signed. И да, char === signed char.

emulek
()
Ответ на: комментарий от emulek

И да, char === signed char.

А не пошёл бы ты, дружок, читать стандарт? Пункт 3.9.1.1, если быть точным

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Зависит от кодировки

в любой кодировке старший бит установлен. Т.ч. знаково 'ф' всегда до отрицательного расширяется.

А не пошёл бы ты

сам иди туда. Signed значит знаковый, unsigned — беззнаковый. В некоторых реализациях может быть только один тип. Масло — масленое. А в ГОСТе на масло этого не прописано, да...

И ещё раз повторяю: вопрос к знаковости отношения не имеет никакого. ТС это уже проверил. Т.ч. сам иди.

emulek
()
Ответ на: комментарий от Gvidon

Signed значит знаковый, unsigned — беззнаковый.

Спасибо, кэп. Я про char спрашивал

какой ты упоротый — signed/unsigned это спецификатор типа, годный для char в том числе. А ещё для short, int, и long. И означает он как раз знаковость/беззнаковость, если целевая система поддерживает и то и другое.

Для x86 разница есть, но только для арифметики. Присваивание реализовано абсолютно одинаково, если ты не изменяешь размер(или изменяешь в меньшую сторону в x86).

Ну а того, что знаковый чар такой знаковый, такого в стандарте нет. Стандарт не для дебилов написан...

emulek
()
Ответ на: комментарий от Gvidon

Совершенно не обязательно. man koi7, например

всё, убедил. Комментарий «упоротый демагог готовый спорить до посинения доказывая всякую очевидную чушь» сейчас впишу.

emulek
()
Ответ на: комментарий от emulek

Стандарт не для дебилов написан...

Так вот почему ты так его и не осилил. Ну ок

Gvidon ★★★★
()
Ответ на: комментарий от emulek

А ты почитай стандарт. Там прямо говорится, что char, unsigned char и signed char — три разных типа, и что знаковость char определяется реализацией. Цитаты из стандарта мне приводить надоело — всё равно никто не читает.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.