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

时间:2014-01-21 17:19:26

标签: c++ vector

假设我有一个向量:

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结合使用,则会在256中生成short

有没有更好的方法来转换像这样的载体?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

理想情况下,您的解决方案应该编写一个函数,从两个字符创建一个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矢量具有奇数个字符,它将忽略最后一个字符)

注意data只是C ++ 11中vector的成员。旧版本替换为&c[0]