std :: строковый эквивалент для данных с нулевыми символами? - PullRequest
4 голосов
/ 08 октября 2009

Я хотел бы прочитать двоичный файл и использовать что-то вроде std::string, которое автоматически изменяет размер буфера и тому подобное.

Я использую Visual C ++. Какие у меня варианты?

Ответы [ 5 ]

10 голосов
/ 08 октября 2009

Класс std::string уже обрабатывает данные со встроенными символами NUL. С какой проблемой вы сталкиваетесь?

Обратите внимание, что при использовании метода .c_str() любой встроенный символ NUL завершит возвращенную строку в стиле C.

8 голосов
/ 08 октября 2009

std::string должен быть безопасным для этого ... вам нужно только быть осторожным, используя метод .c_str() Используйте .data().

5 голосов
/ 08 октября 2009

Вы всегда можете использовать std::vector<unsigned char> v (или любой другой тип ввода, который вы ожидаете), а затем получить буфер, который вы просто &v[0] и v.size() для размера.

2 голосов
/ 17 мая 2010

Да, вы можете встраивать нули в std::string.

Пример:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);

Примечание: std::string элемент c_str() всегда будет добавлять нулевой символ в возвращенный буфер символов; Однако std::string член data() может добавлять или не добавлять нулевой символ в возвращенный буфер символов.

Будьте осторожны с оператором + =

Одна вещь, на которую следует обратить внимание, это не использовать 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 () вы можете напрямую изменять содержимое буфера.

0 голосов
/ 08 октября 2009

std :: string допускает символы NUL, так что вы можете просто пойти дальше и использовать это.

Нет проблем с использованием c_str () или data (). Да, встроенные NUL будут в ваших данных, но если вы не используете их для завершения ваших строк (вам нужно вызвать length (), чтобы узнать, сколько байтов в вашей строке), тогда все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...