我正在使用从网络接收的提供消息的库作为uint8_t
数组,我可以使用std::string
作为这些缓冲区的容器吗?
uint8_t *buffer = ...;
size_t length = ...;
std::string msg = std::string(buffer, length);
这个构造函数导致编译错误?如果我使用reinterpret_cast
将缓冲区转换为char*
,它将编译,但它是否定义良好且合法运行?
您可以安全地投射到char*
,因为标准说char*
可以别名任何其他类型。
// this would be fine
std::string msg(reinterpret_cast<char*>(buffer), length);
顺便说一句,如果你使用reinterpret_cast
的std::string
,你可以避免使用range constructor (number 6)以及对别名的任何疑虑:
std::string msg(buffer, buffer + length);
现在,初始化完全取决于将unsigned char
转换为uint8_t
(因为让我们面对它,这就是char
可能是这样)。转换结果是实现定义的,但不应该令人惊讶。
另外,还应该考虑std::string
是否是正确的抽象。您打算将缓冲区视为字符串类型吗?对于一系列原始字节,没有任何字符串包袱,也许std::vector<std::uint8_t>
或std::vector<std::byte>
可以更容易使用。