C++ 将std::字符串缓冲区转换为整数
我有一个C++ 将std::字符串缓冲区转换为整数,c++,C++,我有一个std::string,其中包含从串行端口接收的四个字节。这些字节以小尾端表示两个int16\t。由于该软件将仅在x86上运行,因此无需更改endianness 我获取单个整数值的第一种方法是: std::string inData = ...; // inData.length() = 4 int16_t measurement[2]; measurement[0] = ( (int16_t)inData[0] << 8 ) | (int16_t)inData[1]; me
std::string
,其中包含从串行端口接收的四个字节。这些字节以小尾端表示两个int16\t
。由于该软件将仅在x86上运行,因此无需更改endianness
我获取单个整数值的第一种方法是:
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];
它按预期工作。然而,这是“正确”的方法吗?或者有没有一种方法可以在不使用重新解释\u cast
的情况下实现这一点
我看了一下,但是被接受的答案和关于别名的评论让我困惑。两者都是正确的,后者最好调用
c_str()
并抛出结果指针。前者的问题是std::string很可能基于有符号字符
。因此,转换为更大的int
类型将扩展符号位,例如0x80
将变为0xff80
如果您使用以下方法修复原始文件:
( (uint8_t)inData[0] << 8 ) | (uint8_t)inData[1];
((uint8_t)inData[0]这两种方法都为我生成相同的结果。请参阅使用std::basic_string
(inData[0]
( (uint8_t)inData[0] << 8 ) | (uint8_t)inData[1];