2015-02-27 8 views
0

Я имею дело с буфером в памяти, который читается как protobuf. Мне нужно десериализовать это. Содержимое этого protobuf содержит строку, которая может содержать или не иметь нулевой символ внутри строки. Например, строка может быть примерно такой: «name \ 0first». Если у меня есть такой ввод, строка, которую я могу десериализовать, всегда выглядит как «имя», так как класс string выдает часть после нулевого символа.Protobuf: строка C++ с нулевыми символами внутри

Как получить доступ к полной строке в этом случае? Функция длины строки, очевидно, не помогает в этом случае.

+0

Вы ошибаетесь - функция 'string :: length()' работает правильно, даже если строка std :: содержит NULL. Вы должны показать нам, что вы делаете сейчас, для доступа или печати этой строки, а затем мы можем показать вам, как правильно получить содержимое строки. – PaulMcKenzie

+1

std :: string может принимать строки со встроенными символами NUL. – jbruni

+0

@PaulMcKenzie: Я написал тривиальную тестовую программу: string s («name \ 0first»); cout << s << endl; cout << s.length() << endl; s.length() не показывает 9. Это 4. –

ответ

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.

Смежные вопросы