Как преобразовать массив символов в шестнадцатеричный поток на основе строки (ostringstream) - PullRequest
4 голосов
/ 27 сентября 2010

в C ++ (в Linux с gcc) Я хотел бы поместить массив байтов (vector<unsigned char>) в ostringstream или string.

Я знаю, что могу использовать sprintf но это не самый лучший способ использовать char*.

кстати: эта ссылка не помогла

Редактировать: Все ответы работают до сих пор.Но я не имел в виду, что я хотел бы преобразовать байты / шестнадцатеричные значения в их строковое представление, например, vector<..> = {0,1,2} -> string = "000102".Извините за эту недостающую, но важную деталь

Ответы [ 5 ]

9 голосов
/ 12 февраля 2013

Мало шансов получить повышающий голос, но, поскольку именно ОП точно запрашивает ОП, и никакой другой ответ, включая выбранный, как ни странно, не делает:

#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();
}

Дамп альтернативного потока

Если все, что вы хотите сделать, это выгрузить массив без знака char, то следующее handly сделает это, что почти не потребует дополнительных затрат.

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;
7 голосов
/ 27 сентября 2010

От вектора 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());
3 голосов
/ 06 января 2015

Использование 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));
3 голосов
/ 27 сентября 2010

Для установки:

#include <iomanip>

Это должно поставить 01 в потоке:

std::ostringstream oss;

unsigned char byte = 0x01;
oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte);
1 голос
/ 27 сентября 2010

То есть вы хотите поместить данные вектора символов в строку?Легко:

string str;
str.resize(vec.size());
for (int n=0;n<vec.size();n++) {
  str[n] = vec[n];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...