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,但接受的答案和關於別名的評論讓我困惑。
兩種方法產生相同的結果對我來說。參見http://ideone.com/bBKj6F –
使用'std :: basic_string'。 –
'(inData [0] << 8)| (inData [1]&0x00FF)'...不需要強制轉換 –