如果我有一个像这样的缓冲区:
uint8_t buffer[32];而且它完全被值填满了,我怎么才能把它变成一个字符串流,用十六进制表示,用0填充小值呢?
我试过了:
std::stringstream ss;
for (int i = 0; i < 32; ++i)
{
ss << std::hex << buffer[i];
}但是,当我将字符串从字符串流中取出时,我遇到了一个问题:值小于16的字节只接受一个字符来表示,并且我希望它们是0填充的。
例如,如果数组中的字节1和字节2是{32} {4},我的字符串流将具有:
204 instead of 2004我是否可以将格式应用于字符串流,以某种方式添加0填充?我知道我可以用sprintf做到这一点,但是流已经被用于大量的信息,以某种方式实现这一点会有很大的帮助。
发布于 2011-10-04 03:33:24
#include <sstream>
#include <iomanip>
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]);
}发布于 2011-10-04 03:30:44
看看流修饰符:std::setw和std::setfill。它会帮到你的。
发布于 2021-09-25 13:22:41
您可以使用C++20 std::format执行此操作
std::stringstream ss;
for (int i = 0; i < 32; ++i) {
ss << std::format("{:02}", buffer[i]);
}在std::format被广泛使用之前,你可以使用the {fmt} library,std::format是基于它的。{fmt}还提供了简化此操作的join函数(godbolt):
std::string s = fmt::format("{:02}", fmt::join(buffer, ""));免责声明:我是{fmt}和C++20 std::format的作者。
https://stackoverflow.com/questions/7639656
复制相似问题