c++ - 如何将包含嵌入空值的 Google Protocol Buffer SerializeAsString() 输出分配给 std::string?

标签 c++ serialization null protocol-buffers stdstring

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

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

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

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

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

提前致谢。

最佳答案

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

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

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

关于c++ - 如何将包含嵌入空值的 Google Protocol Buffer SerializeAsString() 输出分配给 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30370189/

相关文章:

C++:我应该在函数参数中尽可能多地使用常量吗?

django - 如何验证在序列化/反序列化期间至少存在两个字段之一

java - 使用 Jackson 将具有 HashMap 的对象序列化为 JSON 时出现映射异常

mysql convert_tz 命令返回 NULL

C - 将包含 '\0' 的 char 数组复制到另一个 char 数组,消除 '\0'

mysql - 在 MySQL 中选择不为空的 DISTINCT

php - 为什么 php 的 shell_exec 没有给出一些 a.out 文件的输出

c++ - 在数组索引中将变量递增 N

serialization - 尝试扩展 JSONSerializer 时未定义 get

c++ - 如何处理生成它的对象内部的 SIGPIPE 错误?