繁体   English   中英

将std :: string缓冲区转换为整数

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM