c ++, преобразовать std :: string в uint8_t - PullRequest
0 голосов
/ 11 марта 2019

в решении C ++, над которым я работаю, у меня есть функция, которая возвращает ссылку на строку. как const std::string& getData() const {return mData;}, а mData - std::string mData;. теперь я хочу преобразовать его в массив uint8_t, чтобы передать его другому указателю на функцию.

/* in another header -> typedef uint8_t  U8; */
const std::string& d = frame.getData();
U8 char_array[d.length()];
/* here I want to put the d char by char in char_array*/

strcpy устарела, поэтому я использую strcpy_s как strcpy_s(char_array, d);

который, конечно, я получаю couldn't match type char(&)[_size] against unsigned char[]

, а также статическое или переинтерпретативное приведение к char* тоже не работает.

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Используйте вектор, то, что вы пишете, это VLA, который не является допустимым C ++ (U8 char_array[d.length()]). затем используйте std::copy.

const std::string& d = frame.getData();
std::vector<U8> char_array(d.length() + 1, 0);

Вопрос в том, нужен ли вам конец строки \0 или нет, поэтому будет d.length () + 1, если вы хотите последний \0. Тогда:

std::copy(std::begin(d), std::end(d), std::begin(char_array));

Обновление: очевидно, цель состоит в том, чтобы сохранить этот вектор в другом uint8_t[8], если это переменная с именем foo, просто выполните:

std::copy(std::begin(d), std::end(d), std::begin(foo));

Но сначала проверьте длину ... И передайте структуру для заполнения в качестве ссылки. Также получите хорошую книгу по C ++.

0 голосов
/ 11 марта 2019

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

#include <string>
#include <vector>
#include <cstdint>
#include <algorithm>
#include <iterator>
#include <array>

struct foo {
    std::string& getData() {return mData;}
    const std::string& getData() const  {return mData;}
    std::vector<uint8_t> get_array() const {
        std::vector<uint8_t> array;
        std::copy(mData.cbegin(), mData.cend(), std::back_inserter(array));
        return array;
    };

    static constexpr size_t max_size = 8u;
    std::array<uint8_t, max_size> get_max_array() const {
        std::array<uint8_t, max_size> array;
        std::copy_n(mData.cbegin(), max_size, array.begin());
        return array;
    }

private:
    std::string mData;
};
...