如何将包含嵌入空值的 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
的答案。编辑:我将对此的评论移至您的。
我正在尝试使用 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
的答案。编辑:我将对此的评论移至您的