如何将包含嵌入空值的 Google 协议缓冲区 SerializeAsString() 输出分配给 std::string?

How to assign Google protocol buffer SerializeAsString() output which contains embedded nulls to std::string?

我正在尝试使用 google 协议缓冲区将消息序列化为 C++ 中的字符串,并将序列化结果(其中包含嵌入的空值)分配给 std::string。以下是我的代码:

std::string result = message.SerializeAsString();

忽略第一个\0字符之后的字符。结果没有完整的序列化字符串。我尝试了以下明确指定长度的方法。

int size = message.ByteSize();
std::string result(std::string(message.SerializeAsString()), size);

它也不适合我。还有其他方法吗?

提前致谢。

std::string result(message.SerializeAsString(), size);

当您创建临时字符串时

std::string(message.SerializeAsString())

这部分使用嵌入的空值。

在 std::strings 中存储 NUL 字节没有问题。您可以正常分配字符串。您的两个代码片段都应该可以正常工作。

如果您调用 .c_str() 并尝试将字符串传递给期望 const char* 的对象,问题就会出现。此时,const char* 的接收者不知道字符串的大小,因此假设它在第一个 NUL 字节处结束。所以,不要那样做 - 始终确保您传递 std::string 整体,或者同时传递指针和大小(来自 .size())。

您评论了另一个需要转换为 std::wstring 的答案。编辑:我将对此的评论移至您的