簡體   English   中英

解釋std :: vector <char> 作為std :: vector <short>

[英]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;

因為當你將字符01這使得256short

有沒有更好的方法來轉換這樣的向量?

假設您對特定於實現的行為感到滿意,而這種行為在不尋常的體系結構上可能是無法定義的,那么我可以這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM