首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将缓冲区放入十六进制表示的字符串流中:

将缓冲区放入十六进制表示的字符串流中:
EN

Stack Overflow用户
提问于 2011-10-04 03:25:18
回答 3查看 32.8K关注 0票数 33

如果我有一个像这样的缓冲区:

代码语言:javascript
复制
uint8_t buffer[32];

而且它完全被值填满了,我怎么才能把它变成一个字符串流,用十六进制表示,用0填充小值呢?

我试过了:

代码语言:javascript
复制
std::stringstream ss;
for (int i = 0; i < 32; ++i)
{
    ss << std::hex << buffer[i];
}

但是,当我将字符串从字符串流中取出时,我遇到了一个问题:值小于16的字节只接受一个字符来表示,并且我希望它们是0填充的。

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

代码语言:javascript
复制
204 instead of 2004

我是否可以将格式应用于字符串流,以某种方式添加0填充?我知道我可以用sprintf做到这一点,但是流已经被用于大量的信息,以某种方式实现这一点会有很大的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-04 03:33:24

代码语言:javascript
复制
#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]);
}
票数 62
EN

Stack Overflow用户

发布于 2011-10-04 03:30:44

看看流修饰符:std::setwstd::setfill。它会帮到你的。

票数 7
EN

Stack Overflow用户

发布于 2021-09-25 13:22:41

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

代码语言:javascript
复制
std::stringstream ss;
for (int i = 0; i < 32; ++i) {
  ss << std::format("{:02}", buffer[i]);
}

std::format被广泛使用之前,你可以使用the {fmt} librarystd::format是基于它的。{fmt}还提供了简化此操作的join函数(godbolt):

代码语言:javascript
复制
std::string s = fmt::format("{:02}", fmt::join(buffer, ""));

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7639656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档