【问题标题】:Convert size_t to vector<unsigned char>将 size_t 转换为向量<unsigned char>
【发布时间】:2016-01-11 15:09:37
【问题描述】:

我想将 size_t 转换为无符号字符向量。这个向量被定义为 4 个字节。 有人可以建议一种合适的方法吗?

【问题讨论】:

  • 这是错误的做法 - 2016 年的 size_t 通常不适合 4 个 uchars 的向量。
  • 如果你想要无符号字符,创建一个vector&lt;unsigned char&gt;uint8_t 不需要是 unsigned char 的同义词;事实上,有些架构不存在 'uint8_t',但 unsigned char 存在。
  • @PeteBecker:公平地说,如果你在一个不存在uint8_t 的架构上,unsigned char 很可能不代表一个 8 位字节。跨度>
  • @NicolBolas - 不只是一个好机会,一个确定性。但问题是关于unsigned char,事实上,使用unsigned char 比将代码限制为仅在具有本机8 位无符号类型的系统上运行更有意义。

标签: c++ vector byte unsigned-char


【解决方案1】:

一旦您接受了这样一个事实,即您的 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 指针。我在这里利用这一点。以这种方式访问​​数据缓冲区是不寻常的,但其他技巧(使用联合等)通常会导致代码的行为通常是未定义的。

【讨论】:

  • 在我看来,这并没有什么不寻常的地方。通过 data() 访问分配的向量是一件光荣的事情。
【解决方案2】:

通过“转换”,我假设您的意思是“复制”,因为vector 将分配并拥有它的内存。你不能只给它一个指针就指望使用你自己的内存。

一种避免两阶段构造(导致数组初始化为零)的有效方法是这样做:

auto ptr = reinterpret_cast<uint8_t*>(&the_size);
vector<uint8_t> vec{ptr, ptr + sizeof(size_t)};

请注意,sizeof(size_t) 不需要为 4。因此您不应假设它是 4。

【讨论】:

【解决方案3】:

您可以使用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++ 中的 bitset。酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2011-10-19
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多