将 size_t 转换为向量<unsigned char>

Posted

技术标签:

【中文标题】将 size_t 转换为向量<unsigned char>【英文标题】:Convert size_t to vector<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 位无符号类型的系统上运行更有意义。 【参考方案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> vecptr, ptr + sizeof(size_t);

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

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。【参考方案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。酷。

以上是关于将 size_t 转换为向量<unsigned char>的主要内容,如果未能解决你的问题,请参考以下文章

xcode构建失败隐式转换失去整数精度:'size_t'(又名'unsigned long')到'socklen_t'(又名'unsigned int')

如何将 unsigned char[] 转换为 std::vector<unsigned char>

没有匹配函数调用‘std::set<unsigned int>::insert(std::size_t&)

unsigned int 向量的差异,解释为有符号并转换为未正确呈现的浮点向量

将字符串转换为 size_t

将 SSE 矩阵向量乘法代码转换为 AVX