Stworzyłem wektor std::vector<uint8_t> vec{ 0x0C, 0x14, 0x30 };

Chcę zwrócić wartości wektora w łańcuchu "0cd430".

Stworzyłem ten prosty kod:

std::string vectorTostring(const std::vector<uint8_t>& vec)
{
    std::string result;
    for (const auto& v : vec)
    {
        result += std::to_string(v);
    }
    return result;
}

W tym przypadku wynik będzie "122048". Wow Wartości sześciokątny są przechowywane w wektorze bajtów i dlaczego mam wartość dziesiętną, a nie wartość sześciokątna za pomocą to_string?

2
Edutox 27 październik 2020, 11:50

1 odpowiedź

Najlepsza odpowiedź

Proponowałbym użycie std::stringstream i niektórych manipulatorów wyjściowych, takich jak:

#include <sstream>
#include <iomanip>
#include <vector>
#include <string>
#include <iostream>

std::string vectorTostring(const std::vector<uint8_t>& vec)
{
    std::stringstream result;
    for (const auto& v : vec)
    {
        result 
            << std::setfill('0') << std::setw(sizeof(v) * 2)
            << std::hex << +v;
    }
    return result.str();
}

int main()
{
    std::cout << vectorTostring({ 0x0c, 0x14, 0x30 }) << std::endl;
}

Aby wziąć go w odwrotnej kolejności:

  • +v promuje uint8_t / char do int, dzięki czemu wyświetla wartość, a nie znak ASCII.
  • std::hex sprawia, że jest to wyjście w formacie HEX - ale 11 staje się b nie 0b
  • std::setw(sizeof(v) * 2) Ustawia szerokość wyjściową, aby podwoić liczbę bajtów w {X1}} - tutaj - tutaj tylko 1 * 2. Teraz 11 staje się "b".
  • std::setfill('0') Ustawia znak wypełnienia do 0, a na koniec 11 jest obrócony do 0b.
4
Frodyne 27 październik 2020, 09:19