将 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<unsigned char>
。 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&)