我正在使用的库 提供消息 从网络接收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);
顺便说一句,如果您使用std::string
的范围构造函数(数字 6),您可以避免reinterpret_cast
和对混叠的任何疑虑:
std::string msg(buffer, buffer + length);
现在初始化完全取决于将unsigned char
的(因为让我们面对现实吧,uint8_t
可能就是这样)转换为char
。转换结果是实现定义的,但应该不足为奇。
另一方面,还应该考虑std::string
这里是否是正确的抽象。是否打算将缓冲区视为字符串类型?对于没有任何字符串包袱的原始字节序列,也许std::vector<std::uint8_t>
或std::vector<std::byte>
更容易使用。