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

时间:2015-05-21 09:47:00

标签: c++ serialization null protocol-buffers stdstring

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

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

如果您曾致电.c_str()并尝试将字符串传递给期待const char*的字符串,则会出现此问题。此时,const char*的接收器不知道字符串的大小,因此假定它在第一个NUL字节处结束。所以,不要这样做 - 始终确保你要么传递std::string整体,要么传递指针和大小(来自.size())。

您评论了需要转换为std::wstring的其他答案。编辑:我已将此评论移至您的other question

答案 1 :(得分:1)

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

创建临时字符串时

  

的std :: string(message.SerializeAsString())

此部分使用嵌入的空值。