Protobuf:C++ 字符串,里面有空字符

Posted

技术标签:

【中文标题】Protobuf:C++ 字符串,里面有空字符【英文标题】:Protobuf : C++ string with null characters inside 【发布时间】:2015-02-27 22:48:34 【问题描述】:

我正在处理内存中的一个缓冲区,该缓冲区被读取为 protobuf。我需要反序列化它。此 protobuf 的内容包含一个字符串,该字符串中可能有也可能没有空字符。例如,字符串可能是这样的:“name\0first”。如果我有这样的输入,我可以反序列化的字符串总是看起来像“name”,因为字符串类删除了空字符之后的部分。

在这种情况下如何访问完整的字符串?字符串长度函数在这种情况下显然没有帮助。

【问题讨论】:

你错了——string::length() 函数可以正常工作,即使 std::string 包含 NULL。您需要向我们展示您现在正在做什么来访问或打印该字符串,然后我们可以向您展示如何正确获取该字符串的内容。 std::string 可以接受带有嵌入 NUL 字符的字符串。 @PaulMcKenzie:我写了一个简单的测试程序:string s("name\0first"); cout @SantanuC 如果您的字符串包含空字符,则必须使用带有长度参数的构造函数。 【参考方案1】:

首先,您需要适当地构造字符串。您不能使用正在寻找 NULL 终止符的构造函数来构造它,而这正是 string(const char *) 正在寻找的。

你必须使用带有指针和长度的构造函数。

string s("name\0first", 10);

如果您已经构造了一个字符串,并且想要附加嵌入了 NULL 的数据,您可以使用append() 方法。

string s;
s.append("name\0first", 10);

【讨论】:

【参考方案2】:

使用接受字符数std::string s(buffer, nChars) 的构造函数。从这个reference第5次。

【讨论】:

以上是关于Protobuf:C++ 字符串,里面有空字符的主要内容,如果未能解决你的问题,请参考以下文章

js 过滤所有空字符串

proto.MessageName 返回空字符串

java中的nul与空字符串与零的区别l

关于序列化成JSON是NULL值转成空字符串,要怎么搞

使用协议缓冲区/Protobuf 的 PInvoke 通用字符串格式

从二进制文件中删除 protobuf c++ 编译的路径字符串