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