以十六进制表示形式获取缓冲区到字符串流:

Joh*_*0te 30 c++ stringstream

如果我有一个缓冲区,如:

uint8_t buffer[32];
Run Code Online (Sandbox Code Playgroud)

并且它完全被值填充,我怎么能用十六进制表示法将它变成字符串流,在小值上用0填充?

我试过了:

std::stringstream ss;
for (int i = 0; i < 32; ++i)
{
    ss << std::hex << buffer[i];
}
Run Code Online (Sandbox Code Playgroud)

但是当我从字符串流中取出字符串时,我遇到了一个问题:值<16的字节只需要一个字符来表示,我希望它们是0填充的.

例如,如果数组中的字节1和2是{32} {4},我的字符串流将具有:

204 instead of 2004
Run Code Online (Sandbox Code Playgroud)

我可以将格式化应用于stringstream以某种方式添加0-padding吗?我知道我可以用sprintf做到这一点,但是这些流已经被用于获取大量信息,并且以某种方式实现这一点将是一个很大的帮助.

Dea*_*vey 48

std::stringstream ss;
ss << std::hex << std::setfill('0');
for (int i = 0; i < 32; ++i)
{
    ss << std::setw(2) << static_cast<unsigned>(buffer[i]);
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*ews 6

看一下流修饰符: std::setwstd::fill.


vit*_*aut 5

您可以使用 C++20 执行此操作std::format

std::stringstream ss;
for (int i = 0; i < 32; ++i) {
  ss << std::format("{:02}", buffer[i]);
}
Run Code Online (Sandbox Code Playgroud)

std::format广泛可用之前,您可以使用基于{fmt} 的库。std::format{fmt} 还提供了join使这变得更加容易的函数(godbolt):

std::string s = fmt::format("{:02}", fmt::join(buffer, ""));
Run Code Online (Sandbox Code Playgroud)

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