将size_t转换为矢量无符号字符<>

Convert size_t to vector<unsigned char>

本文关键字:字符 无符号 lt gt size 转换      更新时间:2023-10-16

我想将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');