[英]Convert std::string buffer to integers
我有一个std::string
包含从串行端口接收的四个字节。 这些字节在little endian中表示两个int16_t
。 由于该软件只能在x86上运行,因此无需更改字节序。
我获取单个整数值的第一种方法是:
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
即可实现的方法?
我看过将无符号字符转换为有符号整数 ,但是可接受的答案和有关别名的评论使我感到困惑。
两者都是正确的,后者最好通过调用c_str()
并强制转换结果指针来实现。 前者的问题是std :: string最有可能基于已signed char
。 因此,转换为更大的int
类型将扩展符号位,例如0x80
将变为0xff80
。
如果您使用以下方法修复原件:
( (uint8_t)inData[0] << 8 ) | (uint8_t)inData[1];
它也会工作...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.