将 size_t 转换为向量 <unsigned char>
Convert size_t to vector<unsigned char>
我想将 size_t 转换为无符号字符向量。该向量定义为 4 个字节。
有人可以建议一种合适的方法吗?
一旦您接受了这样一个事实,即您的 std::vector
可能必须比这更大 - 它需要有 sizeof(size_t)
个元素 - 一个 well-defined方法是访问这种大小合适的向量的数据缓冲区并使用 ::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()
的重载,即 returns 一个指向数据缓冲区的非 const
指针。我在这里利用这个。以这种方式访问数据缓冲区是不寻常的,但其他技巧(使用联合等)通常会导致代码的行为通常是未定义的。
"convert",我假设你指的是 "copy",因为 vector
将分配并拥有它的内存。你不能只给它一个指针并期望使用你自己的内存。
一种避免two-stage构造(导致数组初始化为零)的有效方法是这样做:
auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};
请注意 sizeof(size_t)
不一定是 4。因此您不应该假设它是 4 就编写代码。
您可以使用 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');
我想将 size_t 转换为无符号字符向量。该向量定义为 4 个字节。 有人可以建议一种合适的方法吗?
一旦您接受了这样一个事实,即您的 std::vector
可能必须比这更大 - 它需要有 sizeof(size_t)
个元素 - 一个 well-defined方法是访问这种大小合适的向量的数据缓冲区并使用 ::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()
的重载,即 returns 一个指向数据缓冲区的非 const
指针。我在这里利用这个。以这种方式访问数据缓冲区是不寻常的,但其他技巧(使用联合等)通常会导致代码的行为通常是未定义的。
"convert",我假设你指的是 "copy",因为 vector
将分配并拥有它的内存。你不能只给它一个指针并期望使用你自己的内存。
一种避免two-stage构造(导致数组初始化为零)的有效方法是这样做:
auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};
请注意 sizeof(size_t)
不一定是 4。因此您不应该假设它是 4 就编写代码。
您可以使用 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');