Скопируйте basic_string & lt; char16_t & gt; на вектор & lt; uint8_t & gt;

Пожалуйста, предложите эффективный способ скопировать байты из basic_string< char16_t> к вектору< uint8_t>.

Я не занимаюсь кодированием, а просто хочу скопировать байты в байтовый массив. Позже это будет интерпретировано с правильной кодировкой в ​​нисходящем направлении.

Благодарю.

1

Решение

Один из вариантов — получить указатель данных, привести его к новому типу и назначить его целевому вектору:

std::basic_string<char16_t> src;

const uint8_t *begin = reinterpret_cast<uint8_t const*>(src.data());
const uint8_t *end = reinterpret_cast<uint8_t const*>(src.data() + src.size());
std::vector<uint8_t> dst(begin,end);

Это один из немногих случаев, когда reinterpret_cast это совершенно правильный выбор. От cppreference (основные моменты добавлены мной):

В отличие от static_cast, но, как const_castвыражение reinterpret_cast не компилируется ни в какие инструкции процессора. Это чисто директива компилятора, которая инструктирует компилятор обрабатывать последовательность битов (представление объекта) выражения как будто у него был тип new_type.

3

Другие решения