使用字符串作为缓冲区容器

Using string as buffer container

本文关键字:缓冲区 字符串      更新时间:2023-10-16

我正在使用的库 提供消息 从网络接收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>更容易使用。