我想将size_t转换为无符号字符的向量。该向量定义为4个字节。 任何人都可以建议一个合适的方法吗?
答案 0 :(得分: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
指针。我在这里利用它。以这种方式访问数据缓冲区是不寻常的,但其他技巧(使用联合等)通常会导致代码的行为通常是未定义的。
答案 1 :(得分:1)
通过“转换”,我假设你的意思是“复制”,因为vector
将分配并拥有其内存。你不能只是给它一个指针,并期望使用你自己的记忆。
这样做的有效方法是避免两阶段构造(导致数组初始化为零)是这样做的:
auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};
请注意,sizeof(size_t)
不需要是4.所以你不应该写代码,假设它是。
答案 2 :(得分: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');