如何将char数组转换为基于字符串的十六进制流(ostringstream)

tue*_*ist 4 c++ string hex ostringstream

在C++中(在Linux上使用gcc)我想把一个byte array(vector<unsigned char>)放到a ostringstream或a中string.

我知道我可以使用,sprintf但它似乎也不是最好的使用方式char*.

顺便说一句:这个链接没有帮助

编辑:目前为止所有答案都有效.但我没有意思,我想将字节/十六进制值转换为它们的字符串表示,例如,vector<..> = {0,1,2} -> string = "000102".对不起,但重要的细节

Who*_*aig 9

获得投票的可能性很小,但因为这正是 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();
}
Run Code Online (Sandbox Code Playgroud)

替代流转储

如果你想要做的是转储为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;
}
Run Code Online (Sandbox Code Playgroud)

当我想将固定缓冲区转储到ostream派生时,我一直使用它.这个电话很简单:

unsigned char data[64];
...fill data[] with, well.. data...
cout << data << endl;
Run Code Online (Sandbox Code Playgroud)


wen*_*eng 8

从vector char arr到stl string:

std::string str(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

从stl字符串到vector char数组:

std::string str = "Hellow World!";
std::vector<unsigned char> v(str.begin(), str.end());
Run Code Online (Sandbox Code Playgroud)