2016-02-02 70 views
1

我有一個std::string包含從串行端口收到的四個字節。這些字節代表兩個小端的int16_t。由於該軟件將僅在x86上運行,因此不需要更改字節序。將std :: string緩衝區轉換爲整數

我的第一種方法來獲得個體整數值是這樣的:

std::string inData = ...; // inData.length() = 4 
int16_t measurement[2]; 
measurement[0] = ((int16_t)inData[0] << 8) | (int16_t)inData[1]; 
measurement[1] = ((int16_t)inData[2] << 8) | (int16_t)inData[3]; 

好,結果看起來像未定義行爲。我預計從inData[x]int16_t將產生有四個MSB設置爲零,但這似乎並非如此。所以我試過這個:

const uint8_t *castedData = reinterpret_cast<const uint8_t*>(&inData[0]); 
measurement[0] = ((int16_t)castedData[0] << 8) | (int16_t)castedData[1]; 
measurement[1] = ((int16_t)castedData[2] << 8) | (int16_t)castedData[3]; 

它按預期工作。但是,這是「正確」的方式嗎?或者有沒有一種方法可以在不使用reinterpret_cast的情況下實現?

我看看Converting unsigned chars to signed integer,但接受的答案和關於別名的評論讓我困惑。

+1

兩種方法產生相同的結果對我來說。參見http://ideone.com/bBKj6F –

+0

使用'std :: basic_string '。 –

+0

'(inData [0] << 8)| (inData [1]&0x00FF)'...不需要強制轉換 –

回答

1

兩者都是正確的,後者會更好地調用c_str()並投射結果指針。前者的問題是std :: string最可能是基於signed char。因此轉換爲更大的int類型將擴展符號位,例如0x80將變爲0xff80

如果修復與原:

((uint8_t)inData[0] << 8) | (uint8_t)inData[1]; 

它會工作太...

相關問題