这是代码:
std::wstringstream wss;
wss.setf(std::ios_base::hex, std::ios_base::basefield);
wss.setf(std::ios_base::showbase);
// wss << std::showbase;
// wss.width(2);
wss.fill('0');
wss << std::setw(2) << 7;
// wss << std::noshowbase;
wss.unsetf(std::ios_base::showbase);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;
auto ret = wss.str();
如果我为流设置showbase
,则总会得到以下输出:
0x7001406
,而不是0x07001406
如何在7之前获得零?我不想像0x
那样手动设置前缀wss << "0x"
。
提前谢谢!
答案 0 :(得分:1)
问题是:前缀是输出宽度的一部分!尝试使用wss << std::setw(4) << 7;
进行比较(您现在会得到00x7
,但这仍然是不必要的...)。
不幸的是,您不能对整数使用precision
来获得与printf("%#.2x\n", 7);
等效的行为,这显然是您想要的...
我的个人版本具有自己的转换器:
template <typename T>
struct Hex
{
Hex(T value, size_t width) : value(value), width(width) { }
private:
T value;
size_t width;
template <typename Stream>
friend Stream& operator<<(Stream& s, Hex h)
{
auto fill = s.fill();
auto flags = s.flags();
s.fill('0');
s << "0x" << std::noshowbase << std::hex << std::setw(h.width) << h.value;
s.fill(fill);
s.flags(flags);
return s;
}
};
template <typename T>
auto hex(T t, size_t width = sizeof(T) * 2) { return Hex<T>(t, width); }
您现在可以将其用作:
wss << hex(7, 2);
比wss << std::setw(2) << 7;
更短,并且具有适合该类型大小的默认值...
还有一个小缺点:带符号和无符号char需要特殊化或重载,因为这些字符输出(0x0s
)而不是数值(0x73
)。
auto hex(char t, size_t width = sizeof(char) * 2)
{ return Hex<unsigned int>(t, width); }
auto hex(signed char t, size_t width = sizeof(signed char) * 2)
{ return Hex<signed int>(t, width); }
auto hex(unsigned char t, size_t width = sizeof(unsigned char) * 2)
{ return Hex<unsigned int>(t, width); }
根据您的需要/期望,您可以默认将2
替换为CHAR_BIT / 4
,这可能会覆盖具有e的系统。 G。 CHAR_BIT == 16
更好...
答案 1 :(得分:1)
感谢@Aconcagua的提示!
我认为我们可以使用 std :: ios_base :: adjustfield 和 std :: ios_base :: internal 这样:
wss.setf(std::ios_base::hex, std::ios_base::basefield);
int oldFlag = wss.setf(std::ios_base::internal, std::ios_base::adjustfield);
然后
wss.setf(std::ios_base::showbase);
wss.fill('0');
wss << std::setw(4) << 7;
wss.unsetf(std::ios_base::showbase);
// wss.setf(oldFlag);
wss << std::setw(2) << 0;
wss << std::setw(2) << 20;
wss << std::setw(2) << 6;
然后我得到0x07001406。如果我不能这样纠正我,谢谢!