如何将字符数组转换为基于字符串的十六进制流(ostringstream)
-
25-09-2019 - |
题
在 C++ 中(在带有 gcc 的 Linux 上)我想放置一个字节数组(vector<unsigned char>
)到一个 ostringstream
或一个 string
.
我知道我可以使用 sprintf
但这似乎不是最好的使用方式 char*
还。
顺便提一句: 这个链接没有帮助
编辑: 到目前为止所有答案都有效。但我并不是说我想将字节/十六进制值转换为其字符串表示形式,例如, vector<..> = {0,1,2} -> string = "000102"
. 。抱歉缺少但重要的细节
解决方案
获得赞成票的机会很小,但既然是 确切地 OP要求什么,没有其他答案,包括所选的答案,奇怪的是,这样做:
#include <iostream>
#include <sstream>
#include <vector>
#include <iomanip>
// used by bin2hex for conversion via stream.
struct bin2hex_str
{
std::ostream& os;
bin2hex_str(std::ostream& os) : os(os) {}
void operator ()(unsigned char ch)
{
os << std::hex
<< std::setw(2)
<< static_cast<int>(ch);
}
};
// convert a vector of unsigned char to a hex string
std::string bin2hex(const std::vector<unsigned char>& bin)
{
std::ostringstream oss;
oss << std::setfill('0');
std::for_each(bin.begin(), bin.end(), bin2hex_str(oss));
return oss.str();
}
// or for those who wish for a C++11-compliant version
std::string bin2hex11(const std::vector<unsigned char>& bin)
{
std::ostringstream oss;
oss << std::setfill('0');
std::for_each(bin.begin(), bin.end(),
[&oss](unsigned char ch)
{
oss << std::hex
<< std::setw(2)
<< static_cast<int>(ch);
});
return oss.str();
}
备用流转储
如果您只想转储 unsigned char 固定数组,则以下内容将 轻而易举地 这样做,这几乎没有任何开销可言。
template<size_t N>
std::ostream& operator <<(std::ostream& os, const unsigned char (&ar)[N])
{
static const char alpha[] = "0123456789ABCDEF";
for (size_t i=0;i<N;++i)
{
os.put(alpha[ (ar[i]>>4) & 0xF ]);
os.put(alpha[ ar[i] & 0xF ]);
}
return os;
}
当我想将固定缓冲区转储到 ostream 衍生物时,我总是使用它。这个调用非常简单:
unsigned char data[64];
...fill data[] with, well.. data...
cout << data << endl;
其他提示
从向量 char arr 到 stl 字符串:
std::string str(v.begin(), v.end());
从 stl 字符串到向量字符数组:
std::string str = "Hellow World!";
std::vector<unsigned char> v(str.begin(), str.end());
对于 setw 包括:
#include <iomanip>
这应该将 01 放入流中:
std::ostringstream oss;
unsigned char byte = 0x01;
oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte);
使用 升压::算法::十六进制
std::vector<unsigned char> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
对于 std::ostream
std::ostream ss;
boost::algorithm::hex(v.begin(), v.end(), std::ostream_iterator<char>(ss));
对于 std::string
std::string res;
boost::algorithm::hex(v.begin(), v.end(), back_inserter(res));
那么您想将字符向量的数据放入字符串中吗?简单的:
string str;
str.resize(vec.size());
for (int n=0;n<vec.size();n++) {
str[n] = vec[n];
}
不隶属于 StackOverflow