Подтвердить что ты не робот

Действительно, использовать 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.
4b9b3361

Ответ 1

Да, вы можете сохранить любую последовательность char в std::string. Это включает любые двоичные данные.

Ответ 2

Да. std::string может содержать любое значение char ('\0' не имеет особого значения). Однако я бы не удивился, найдя некоторые функции С++ (например, из внешних библиотек), имеющие проблемы со строками со встроенными NUL.

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

Ответ 3

Я не думаю, что нужно использовать std::string для хранения байтов данных. Предоставляемый метод не предназначен для обработки байтовых данных, и вы рискуете собой, так как любые изменения (или "оптимизация" ) на std::string нарушат ваш код.

Ответ 4

Для хранения двоичных данных требуется массив символов (не строка). Лучше всего использовать вектор.