如何使用字符串流格式化十六进制数字

Posted

技术标签:

【中文标题】如何使用字符串流格式化十六进制数字【英文标题】:how to format hex numbers using stringstream 【发布时间】:2014-09-28 08:54:12 【问题描述】:

我正在尝试使用 stringstream 将 unsigned short 转换为其十六进制表示形式,并以 0 为前缀。我似乎无法正确理解大写字母和 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' 基数也为大写,但我希望它为小写。它还导致前缀 0x 基数(当前为 0X)之后的十六进制值没有前缀 0。例如,这将输出 0X467 而不是预期的 0x0467。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

setw 将设置整个格式化输出的宽度,包括显示的基数,这就是您看不到前导 0 的原因。此外,如果您使用std::showbasestd::uppercase,则无法将base 显示为小写。解决方法是手动插入底座,然后应用剩余的机械手。

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

这会输出0x0467

【讨论】:

顺便提一下std::internal 可用于获取基数和数字之间的填充字符(但如果您想要不同大小写的基数和数字,则无济于事)。

以上是关于如何使用字符串流格式化十六进制数字的主要内容,如果未能解决你的问题,请参考以下文章

405. 数字转换为十六进制数

LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化

leetcode 简单 第九十五题 数字转换为十六进制数

位运算————数字转换为十六进制

16进制字符串如何转化16进制数值

JAVA如何将二进制数转换成文件?