Ответ 1
Да, вы можете иметь встроенные нули в своем std::string
.
Пример:
std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
Примечание: член std::string
c_str()
всегда будет добавлять нулевой символ в возвращаемый буфер char; Тем не менее, член std::string
data()
может добавлять или не добавлять нулевой символ в возвращаемый буфер char.
Будьте осторожны с оператором + =
Единственное, на что нужно обратить внимание, - не использовать operator+=
с char*
в RHS. Он будет складываться только до нулевого символа.
Например:
std::string s = "hello";
s += "\0world";
assert(s.length() == 5);
Правильный способ:
std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);
Сохранение двоичных данных, более распространенных для использования std::vector
Как правило, чаще всего используется std::vector
для хранения произвольных двоичных данных.
std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();
Это, вероятно, более распространено, поскольку члены std::string
data()
и c_str()
возвращают константные указатели, поэтому память не модифицируется. с помощью & buf.front() вы можете напрямую изменять содержимое буфера.