2016-01-11 2 views
1

Я хочу преобразовать size_t в вектор беззнаковых символов. Этот вектор определяется как 4 байта. Может ли кто-нибудь предложить подходящий способ сделать это?Преобразование size_t в вектор <unsigned char>

+5

Это было бы неправильно, что нужно сделать - size_t в 2016 году как правило, не вписывается в вектор 4 uchars. – SergeyA

+1

Если вы хотите беззнаковые символы, создайте 'vector '. 'uint8_t' не является синонимом' unsigned char'; на самом деле существуют архитектуры, где «uint8_t» не существует, но «unsigned char» делает. –

+0

@PeteBecker: Если честно, если вы находитесь в архитектуре, где 'uint8_t' не существует, есть хорошая вероятность, что' unsigned char' не представляет собой 8-битный байт. –

ответ

2

Как только вы примирились с тем фактом, что ваш std::vector, вероятно, должен быть больше, чем это - ему нужно будет иметь sizeof(size_t) элементов - одним из четко определенных способов является доступ к буферу данных такого надлежащего размер вектор и использовать ::memcpy:

size_t bar = 0; /*initialise this else the copy code behaviour is undefined*/ 
std::vector<uint8_t> foo(sizeof(bar)); /*space must be allocated at this point*/ 
::memcpy(foo.data(), &bar, sizeof(bar)); 

Существует перегрузка data(), которая возвращает не- const указателя на буфер данных. Я использую это здесь. Доступ к буферу данных таким образом необычен, но другие трюки (с использованием объединений и т. Д.) Часто приводят к коду, поведение которого, как правило, не определено.

+0

это отлично работает, спасибо – Vanya

+0

Нет ничего необычного в этом, на мой взгляд. Доступ к выделенному вектору через данные() - это заслуженная вещь. – SergeyA

1

Под «конвертировать», я предполагаю, что вы имеете в виду «копировать», поскольку vector выделит и сохранит свою память. Вы не можете просто дать ему указатель и рассчитывать использовать свою собственную память.

Эффективный способ сделать так, что исключает две стадии строительства (что приводит к инициализации массива с нуля), чтобы сделать это:

auto ptr = reinterpret_cast<uint8_t*>(&the_size); 
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)}; 

Обратите внимание, что sizeof(size_t) не требуется быть 4. Таким образом, вы не следует писать свой код, предполагая, что это так.

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/100406/discussion-on-answer-by-nicol-bolas-convert-size-t-to-vectorunsigned-char). –

0

Вы можете написать общий конвертер с помощью std::bitset

template <typename T> 
std::vector<unsigned char> Type_To_Bit_Vector(T type, char true_char, char false_char){ 

    //convert type to bitset 
    std::bitset<sizeof(type)*8> bset(type); 

    //convert bitset to vector<unsigned char> 
    std::vector<char> vec; 
    for(int i = 0 ; i < bset.size() ; i++){ 
     if (bset[i]){ 
      vec.push_back(true_char); 
     }else{ 
      vec.push_back(false_char); 
     } 
    } 

    return vec; 
} 

Вы могли бы получить желаемое векторное представление, как так:

auto vec = Type_To_Bit_Vector(size_t(123),'1','0'); 
+0

Thanx для приведения другого варианта. Еще не пробовал. Такое решение было на самом деле на первом месте (вроде цикла), но я не знал о битах в C++. Круто. – Vanya

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