将 std::vector<char> 解释为 std::vector<short>

Interpret std::vector<char> as std::vector<short>

本文关键字:gt lt vector std short 解释 char      更新时间:2023-10-16

>假设我有一个向量:

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;

因为如果你把字符01结合起来,它会256short.

有没有更好的方法来转换这样的矢量?

假设您对特定于实现的行为感到满意,这可能在不寻常的架构上未定义,那么我会这样做:

short *ptr = reinterpret_cast<short*>(c.data());
std::vector<short> s(ptr, ptr+c.size()/2);

如果你想要的是将char数组视为一半short的小端表示,而不管实现的字节序性如何,那么它有点复杂。像这样:

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);
}

请注意,这仍然涉及从无符号类型到有符号类型的转换,因此它仍然依赖于实现。你需要更多的比特摆动才能使它真正便携。

理想情况下,您的解决方案应编写一个函数,该函数从两个字符创建短整型,并且不依赖于平台上的平台字节序或短型的大小。

更容易做无签名,你可以简单地做一些事情

,比如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 );

如果矢量的大小为奇数,它将"截断"矢量中的最后一个字符。(即,如果字符向量具有奇数个字符,它将忽略最后一个字符)

注意data只是 C++11 中向量的成员。对于旧版本,请替换为&c[0]