Я хочу преобразовать 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
- 1. Преобразование вектора <unsigned char> в вектор <unsigned short>
- 2. Преобразование Int в size_t
- 3. Почему преобразование из size_t в unsigned int дает мне предупреждение?
- 4. Загрузка файла в вектор <unsigned char>
- 5. Преобразование вектора <unsigned char> в const unsigned char *
- 6. Преобразование size_t в строку
- 7. Преобразование вектора <unsigned char> в HBITMAP в C++
- 8. Разница между size_t и unsigned int?
- 9. Что является недостатком замены size_t unsigned long
- 10. Как преобразовать вектор <uint8_t> в unsigned char *
- 11. конвертирующий вектор <unsigned long> в буфер символов []
- 12. Как преобразовать вектор <unsigned char> в int?
- 13. Преобразование jobjectarray в вектор <uint8_t>
- 14. Преобразование char в вектор <float>
- 15. Преобразование аннулируется * в вектор <int>
- 16. Преобразование из size_t в целое
- 17. Как написать вектор <unsigned char> в файл, за которым следует unsigned int
- 18. size_t 0x1 << 31 намного больше, чем size_t 0x1 << 30
- 19. Преобразование ATL :: CString в std :: vector <unsigned char>
- 20. Преобразование (void *) в std :: vector <unsigned char>
- 21. преобразование матрицы в StD :: вектор
- 22. Есть ли преимущества в использовании size_t вместо unsigned int?
- 23. read (int fd, void * buf, size_t count): предотвратить неявное преобразование
- 24. string (from substr) преобразование в unsigned int
- 25. Преобразование jshort в unsigned short
- 26. Преобразование double в unsigned char?
- 27. Преобразование строки в unsigned char
- 28. Преобразование структуры в unsigned char *
- 29. Проблемное преобразование из unsigned_int в size_t
- 30. Преобразование size_t в длинный, Есть ли недостаток?
Это было бы неправильно, что нужно сделать - size_t в 2016 году как правило, не вписывается в вектор 4 uchars. – SergeyA
Если вы хотите беззнаковые символы, создайте 'vector'. 'uint8_t' не является синонимом' unsigned char'; на самом деле существуют архитектуры, где «uint8_t» не существует, но «unsigned char» делает. –
@PeteBecker: Если честно, если вы находитесь в архитектуре, где 'uint8_t' не существует, есть хорошая вероятность, что' unsigned char' не представляет собой 8-битный байт. –