Скопируйте basic_string<char16_t> в вектор<uint8_t>

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

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

Благодарю.

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,

Другие вопросы по тегам