如何分配谷歌协议缓冲区SerializeAsString()输出,其中包含嵌入空到std::string

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

本文关键字:包含嵌 std string 输出 分配 何分配 谷歌 协议 SerializeAsString 缓冲区      更新时间:2023-10-16

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

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

忽略第一个字符之后的字符。结果是没有完整的序列化字符串。我尝试了以下显式指定长度的命令。

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

它也不适合我。还有别的办法吗?

在std::string中存储NUL字节没有问题。你可以正常地赋值字符串。这两个代码段应该都能正常工作。

如果您调用.c_str()并试图将字符串传递给期望const char*的东西,问题就来了。在这一点上,const char*的接收器不知道字符串的大小,所以假设它在第一个NUL字节结束。所以,不要这样做——总是确保你要么传递整个std::string,要么传递指针和大小(来自.size())。

你评论了另一个答案,你需要转换为std::wstring。编辑:我把我对这个问题的评论转移到你的另一个问题上了。

std::string result(message.SerializeAsString(), size);
当您创建临时字符串 时

std:: string (message.SerializeAsString ())

这部分使用嵌入的空