![](/img/trans.png)
[英]Interpret a std::string as a std::vector of char_type?
[英]Interpret std::vector<char> as std::vector<short>
假设我有一个向量:
std::vector <char> c;
c.push_back(0);
c.push_back(1);
c.push_back(0);
c.push_back(1);
我想将其转换为std::vector<short> s
,以便元素可以:
s[0] == 256;
s[1] == 256;
因为当你将字符0
和1
这使得256
在short
。
有没有更好的方法来转换这样的向量?
假设您对特定于实现的行为感到满意,而这种行为在不寻常的体系结构上可能是无法定义的,那么我可以这样做:
short *ptr = reinterpret_cast<short*>(c.data());
std::vector<short> s(ptr, ptr+c.size()/2);
如果您想要将char
数组看作是short
的一半的little-endian表示形式,而不管实现的字节顺序如何,那么它会稍微复杂一些。 像这样:
std::vector<short> s;
s.reserve(c.size() / 2);
for (size_t idx = 0; idx < c.size(); idx += 2) {
s.push_back(c[idx] & 0xff + static_cast<unsigned>(c[idx+1]) << 8);
}
请注意,这仍然涉及从无符号类型到带符号类型的转换,因此它仍然取决于实现。 您需要进行更多操作才能使其真正可移植。
理想情况下,您的解决方案应该编写一个从两个字符创建一个short的函数,而不依赖于平台字节序或平台上short的大小。
进行无符号签名更容易,您可以在其中简单地执行以下操作: ptr[i] + static_cast<unsigned short>( ptr[i+1] ) << 8;
如果您只想直接通过强制复制复制数据,那么它是微不足道的。
const short * data = reinterpret_cast< const short * > ( c.data() );
std::vector< short > s( data, data + c.size() / 2 );
如果它的大小是奇数,它将“截断”向量中的最后一个字符。 (即,如果char向量的char数为奇数,它将忽略最后一个)
注意data
只是C ++ 11中vector的成员。 对于较旧的版本,请替换为&c[0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.