我有一个 std::string
包含从串行端口接收的四个字节。这些字节代表小端字节序中的两个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
的情况下实现这一点?
我看过Converting unsigned chars to signed integer ,但接受的答案和关于别名的评论让我感到困惑。
最佳答案
两者都是正确的,后者在调用 c_str()
并转换结果指针时会更好。前者的问题是 std::string 很可能基于 signed char
。因此,转换为更大的 int
类型将扩展符号位,例如 0x80
将变为 0xff80
。
如果您修复原件:
( (uint8_t)inData[0] << 8 ) | (uint8_t)inData[1];
它也会工作...
关于c++ - 将 std::string 缓冲区转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156724/