Подтвердить что ты не робот

Как форматировать шестнадцатеричные числа, используя stringstream

Я пытаюсь преобразовать unsigned short в его шестнадцатеричное представление в верхнем регистре и с префиксом 0 с использованием stringstream. Я не могу получить верхний регистр и 0 правильно. вот что у меня есть сейчас:

USHORT id = 1127;
std::stringstream ss;
ss << std::showbase << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
std::string result = ss.str();

это приводит к тому, что базовая база "0x" также имеет верхний регистр, но я хочу, чтобы это было строчным. он также не приводит к префиксному 0 в шестнадцатеричное значение после префиксной базы 0x (в настоящее время 0X). например, теперь будет выводиться 0X467 вместо ожидаемого 0x0467. как это исправить?

4b9b3361

Ответ 1

setw будет устанавливать ширину всего отформатированного вывода, включая отображаемую базу, поэтому вы не видите ведущую 0. Кроме того, нет способа сделать базу отображаемой в нижнем регистре, если вы используете std::showbase вместе с std::uppercase. Решение состоит в том, чтобы вставить базу вручную, а затем применить оставшиеся манипуляторы.

ss << "0x" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;

Это выводит 0x0467