如何使用 A-F(而不是 a-f)流式传输十六进制数字?

Posted

技术标签:

【中文标题】如何使用 A-F(而不是 a-f)流式传输十六进制数字?【英文标题】:How can I stream hexadecimal numbers with A-F (rather than a-f)? 【发布时间】:2011-05-06 06:03:52 【问题描述】:

是否可以让ostream 输出带有字符A-F 而不是a-f 的十六进制数字?

int x = 0xABC;
std::cout << std::hex << x << std::endl;

这会输出abc,而我更希望看到ABC

【问题讨论】:

能否请这个问题的反对者向我解释这个问题有什么犯罪行为?事实上,我已经打开 MSDN for 'hex' 希望找到答案,但我没有。那么这个问题有什么问题呢? 不知道,但这里有一个反对意见。我喜欢这样做,因为它是公平的(尤其是对于那些有真正问题的人 - SO 是为 所有 级别的开发人员而设计的,而不仅仅是像我这样令人讨厌的无所不知的人)但主要是因为它惹恼了那些甚至懒得发表评论以便改进问题的投票者。当然,他们很可能会在报复中对我的回答投反对票,但这并不像我缺少代表:-) @paxdiablo:我对报复性投票的感觉是,任何可能卷入此类废话的人的声望都不到我的一半,所以我会赢得那个。因为我的声望不到你的一半,所以你的寿命可以延长两倍…… 【参考方案1】:

是的,你可以使用std::uppercase,它会影响浮点数和十六进制整数输出:

std::cout << std::hex << std::uppercase << x << std::endl;

如以下完整程序:

#include <iostream>
#include <iomanip>

int main (void) 
    int x = 314159;
    std::cout << std::hex << x << " " << std::uppercase << x << std::endl;
    return 0;

哪个输出:

4cb2f 4CB2F

【讨论】:

这个修饰符会只影响十六进制数字,还是也会影响字符串? 科学计数法中的十六进制数和指数。如果你想做字符串,见***.com/questions/735204/…【参考方案2】:

在 C++20 中,您将能够使用 std::format 来执行此操作:

std::cout << std::format(":X\n", 0xABC);  

输出:

ABC

同时你可以使用the fmt library,std::format是基于。 fmt 还提供了print 函数,使这更容易和更高效(godbolt):

fmt::print(":X\n", 0xABC); 

免责声明:我是 fmt 和 C++20 std::format 的作者。

【讨论】:

以上是关于如何使用 A-F(而不是 a-f)流式传输十六进制数字?的主要内容,如果未能解决你的问题,请参考以下文章

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道

使用正则将十六进制颜色值解析为rgb三通道

Golang-进制

十六进制字符串转化为十进制整数