protocol buffer say it can contain any arbitrary sequence of bytes. but if my data contain '\0' ,how protocol buffer can encode my whole data from a string variable.
Asked
Active
Viewed 3.0k times
24
-
What do you mean by "a string variable"? Is this a `char *`? Is it C, Java or something else? – Marcelo Cantos Jul 13 '12 at 09:21
-
1@Marcelo I'm guessing he means `string` from `
`... – Marc Gravell Jul 13 '12 at 09:22 -
2I'm not a c++ person any more, but I was under the impression that `\0` has no special significance in a c++ string **unless** you are using methods that specifically handle `\0`. So... just don't use those methods? – Marc Gravell Jul 13 '12 at 09:23
-
strings can contain `\0`. Some APIs operate on the assumption of strings being \0 terminated (eg. the traditional C runtime) but modern APIs operate on pointer-and-length or pointer-to-starte-and-pointer-to-end representations which do not require `\0` to be considered 'special'. – Remus Rusanu Jul 13 '12 at 09:25
-
Duh. I must have missed the "c++" in the heading (or maybe it was added during the early-edit window; I remember looking for the language and not seeing it). – Marcelo Cantos Jul 13 '12 at 12:21
1 Answers
35
The C++ implementation of protocol buffers returns the byte and string types as std::string
. This structure contains a length function telling you how long the corresponding data is (as well as the data itself.) Thus there is no special significance of embeded \0
characters.
The setting functions accept a string too, or there are versions that accept a buffer and length. If you want to set a field you can just do this:
pb.set_foo( std::string( data, data_length ) );
or
pb.set_foo( data, data_length );

Michael Anderson
- 70,661
- 7
- 134
- 187
-
See also https://stackoverflow.com/questions/2845769/can-a-stdstring-contain-embedded-nulls – Raedwald Nov 23 '17 at 22:42
-
2