将size_t转换为矢量无符号字符<>
Convert size_t to vector<unsigned char>
我想将size_t转换为无符号字符的矢量。该矢量定义为4个字节。有人能提出一个合适的方法吗?
一旦你接受了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
指针。我正在利用这一点。以这种方式访问数据缓冲区是不寻常的,但其他技巧(使用联合等)通常会导致代码的行为不明确。
我认为"convert"是指"复制",因为vector
将分配并拥有它的内存。你不能只是给它一个指针,然后期望使用你自己的内存。
这样做的一个有效方法是避免两阶段构建(导致数组初始化为零):
auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};
注意,sizeof(size_t)
不需要是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');
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中