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

标签 c++

我有一个 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/

相关文章:

c++ - MongoDB C++ Legacy 驱动程序 - 如何使用 UNIX 域套接字进行连接

c++ - 是否可以通过接口(interface)避免库依赖性问题

c++ - 将纪元时间转换为格式化 GMT 并返回 C++

c++ - 在 C 和 C++ 中更改控制台输出的背景颜色

c++ - 如何获取 ATL DLL 中的 HWND(用于 SendMessage 或 PostMessage)

c++ - 为什么编译器不将此标记为错误而不是警告?

c++ - 在调用 QGraphicsItem::paint 之前

c++ - 使用具有默认值的引用参数是好习惯吗?

php - HttpSendRequest 12005 错误

c++ - 如何在树莓派上使用 OpenCV VideoCapture 类?