Как преобразовать вектор строк в вектор uint8_t - PullRequest
0 голосов
/ 12 июня 2019

Короткая версия:

У меня есть строка: 0x4D;0x90;0x69

Я хочу массив

static const uint8_t array[] = {
    0x4D, 0x90, 0x69
} 

Как это сделать?

1011 *

Более длинная версия:

У меня есть строка (buffer) со следующим: 0x4D​0x90​0x69 между этими шестнадцатеричными "числами" находятся пробелы нулевой ширины, и я разделил их на вектор строк, используя

std::vector<std::string> v{ explode(buffer, '\u200B') };

Я хочу, чтобы вектор содержал данные uint8_t.

Я уже пытался переосмыслить строку, и это действительно сработало. Но я поместил его в цикличный цикл, и он должен выдвинуть результат в uint8_t Vector, но в Vector было только 0x00.

std::vector < std::string > v {
  explode(buffer, '\u200B')
};
std::vector < uint8_t * > ob;
for (auto n: v) {
  uint8_t * p = reinterpret_cast < uint8_t * > ( & n);
  //std::cout << n << " | " << p << std::endl;
  ob.push_back(p);
};

for (auto na : ob) std::cout << na << std::endl;

Я получаю только три 0x00 в консоли.

Я хочу, чтобы static const uint8_t arr[] содержал buffer, разделенный на части.

Edit: Я забыл добавить функцию explode здесь, в основном это просто разделение. `` `Каст

const std::vector<std::string> explode(const std::string& s, const char& c)
{
    std::string buff{ "" };
    std::vector<std::string> v;
    for (auto n : s)
    {
        if (n != c) buff += n; else
            if (n == c && buff != "") { v.push_back(buff); buff = ""; }
    }
    if (buff != "") v.push_back(buff);

    return v;
}

1 Ответ

0 голосов
/ 12 июня 2019
for (auto n : v)

Это берет копию каждой вещи в v, которая живет в течение всего тела цикла.

uint8_t * p = reinterpret_cast < uint8_t * > ( & n);

Это дает вам указатель на локальную скопированную вещь после реинтерпретации.

ob.push_back(p);

Сохраняет указатель на вектор.

}

Это делает все эти указатели свисающими.

Чтобы исправить это UB, вы можете попробовать for (const auto& n : v).

Однако есть и другие проблемы. Каждая из этих «вещей» - это std::string! Бессмысленно разыгрывать std::string* до uint8_t* и не совсем понятно, что вы хотели этим достичь. Вы хотели бросить результат n.c_str() в uint8_t*? Но тогда это тоже ничего не дает.

Я думаю, вам нужно изучить лучший способ интерпретировать последовательность символов как число и преобразовать ее в целое число .

...