![](/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.