簡體   English   中英

如何將char數組轉換為基於字符串的十六進制流(ostringstream)

[英]How to convert a char array into string based hex-stream (ostringstream)

在C ++中(在Linux上使用gcc)我想把一個字節數組( vector<unsigned char> )放到ostringstreamstring

我知道我可以使用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;

從vector char arr到stl string:

std::string str(v.begin(), v.end());

從stl字符串到vector char數組:

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

使用boost :: alogorithm :: hex

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));

對於setw包括:

#include <iomanip>

這應該把01放在流中:

std::ostringstream oss;

unsigned char byte = 0x01;
oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte);

所以你想把一個字符向量的數據放到一個字符串中? 簡單:

string str;
str.resize(vec.size());
for (int n=0;n<vec.size();n++) {
  str[n] = vec[n];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM