2014-09-04 2 views
1

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

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

Спасибо.

+0

Итак, вы хотите, чтобы два символа в векторе для каждого символа в строке? –

+0

Да. Мой персонаж находится в UTF-16. Так что это два байта. – SkypeMeSM

ответ

3

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

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.

+0

Спасибо за ваш ответ. Я сделал это именно так. Но я действительно задавался вопросом, есть ли другой способ избежать reinterpret_casts. – SkypeMeSM

+1

@SkypeMeSM Я думаю, что в этом случае reinterpret_cast отлично действует. В конце концов, это именно то, что сделано: массив 'char16_t' побито интерпретируется как массив' uint8_t'. – MatthiasB

Смежные вопросы