Я хочу преобразовать size_t в вектор беззнаковых символов. Этот вектор определяется как 4 байта. Может ли кто-нибудь предложить подходящий способ сделать это?Преобразование size_t в вектор <unsigned char>
ответ
Как только вы примирились с тем фактом, что ваш 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
указателя на буфер данных. Я использую это здесь. Доступ к буферу данных таким образом необычен, но другие трюки (с использованием объединений и т. Д.) Часто приводят к коду, поведение которого, как правило, не определено.
Под «конвертировать», я предполагаю, что вы имеете в виду «копировать», поскольку vector
выделит и сохранит свою память. Вы не можете просто дать ему указатель и рассчитывать использовать свою собственную память.
Эффективный способ сделать так, что исключает две стадии строительства (что приводит к инициализации массива с нуля), чтобы сделать это:
auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};
Обратите внимание, что sizeof(size_t)
не требуется быть 4. Таким образом, вы не следует писать свой код, предполагая, что это так.
Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/100406/discussion-on-answer-by-nicol-bolas-convert-size-t-to-vectorunsigned-char). –
Вы можете написать общий конвертер с помощью 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');
Thanx для приведения другого варианта. Еще не пробовал. Такое решение было на самом деле на первом месте (вроде цикла), но я не знал о битах в C++. Круто. – Vanya
Это было бы неправильно, что нужно сделать - size_t в 2016 году как правило, не вписывается в вектор 4 uchars. – SergeyA
Если вы хотите беззнаковые символы, создайте 'vector'. 'uint8_t' не является синонимом' unsigned char'; на самом деле существуют архитектуры, где «uint8_t» не существует, но «unsigned char» делает. –
@PeteBecker: Если честно, если вы находитесь в архитектуре, где 'uint8_t' не существует, есть хорошая вероятность, что' unsigned char' не представляет собой 8-битный байт. –