Ответ 1
Да, вы можете сохранить любую последовательность char
в std::string
. Это включает любые двоичные данные.
Обратите внимание на base64_decode
в http://www.adp-gmbh.ch/cpp/common/base64.html
std::string base64_decode(std::string const& encoded_string)
Функция должна возвращать byte array
для указания двоичных данных. Однако функция возвращает std::string
. Я предполагаю, что автор пытается избежать явного распределения динамической памяти.
Я пытаюсь проверить правильность вывода.
int main()
{
unsigned char data[3];
data[0] = 0; data[1] = 1; data[2] = 2;
std::string encoded_string = base64_encode(data, 3);
// AAEC
std::cout << encoded_string << std::endl;
std::string decoded_string = base64_decode(encoded_string);
for (int i = 0; i < decoded_string.length(); i++) {
// 0, 1, 2
std::cout << (int)decoded_string.data()[i] << ", ";
}
std::cout << std::endl;
getchar();
}
Выбранный выход корректен. Просто хочу подтвердить, допустимо ли std::string
хранить двоичные данные, чтобы избежать ручного управления динамической памятью.
std::string s;
s += (char)0;
// s.length() will return 1.
Да, вы можете сохранить любую последовательность char
в std::string
. Это включает любые двоичные данные.
Да. std::string может содержать любое значение char ('\0'
не имеет особого значения). Однако я бы не удивился, найдя некоторые функции С++ (например, из внешних библиотек), имеющие проблемы со строками со встроенными NUL.
В любом случае я не понимаю, что вы собираетесь получить с помощью std::string
вместо std::vector<unsigned char>
, что сделает ваши намерения более ясными и даст больше гарантий (например, что все байты находятся в смежной не разделяемой памяти так что вы можете передать &x[0]
кому-то, ожидая простой буфер для прямого доступа).
Я не думаю, что нужно использовать std::string для хранения байтов данных. Предоставляемый метод не предназначен для обработки байтовых данных, и вы рискуете собой, так как любые изменения (или "оптимизация" ) на std::string нарушат ваш код.
Для хранения двоичных данных требуется массив символов (не строка). Лучше всего использовать вектор.