Преобразовать из вектора to char * включает данные мусора - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь декодировать строку base64, а затем преобразовать это значение в массив символов для дальнейшего использования. Декодирование работает нормально, но при преобразовании я получаю мусорные данные.

Вот код, который у меня есть:

std::string encodedData = "VGVzdFN0cmluZw=="; //"TestString"
std::vector<BYTE> decodedData = base64_decode(encodedData);

char* decodedChar;
decodedChar = new char[decodedData.size() +1]; // +1 for the final 0
decodedChar[decodedData.size() + 1] = 0; // terminate the string
for (size_t i = 0; i < decodedData.size(); ++i) {
    decodedChar[i] = decodedData[i];
}

vector<BYTE> - это typedef из unsigned char BYTE , как взято из этого ТАК. Код base64 также взят из этого ответа (самый популярный ответ, а не принятый ответ). Когда я запускаю этот код, я получаю следующее значение в VisualStudio Text Visualiser:

TestStringÍ

Я также пробовал другие методы преобразования, такие как:

char* decodedChar = reinterpret_cast< char *>(&decodedData[0]);

Что дает следующее:

TestStringÍÍÍýýýýÝÝÝÝÝÝÝ*b4d“

Почему я получаю данные мусора в конце строки? Что я делаю не так?

EDIT: пояснил, какой ответ в связанном вопросе я использую

Ответы [ 2 ]

3 голосов
/ 13 июля 2020
char* decodedChar;
decodedChar = new char[decodedData.size() +1]; // +1 for the final 0

Зачем вам вручную выделять буфер, а затем копировать в него, если у вас есть std::string, которое сделает это за вас?

Просто сделайте:

std::string encodedData = "VGVzdFN0cmluZw=="; //"TestString"
std::vector<BYTE> decodedData = base64_decode(encodedData);

std::string decodedString { decodedData.begin(), decodedData.end() };

std::cout << decodedString << '\n';

Если вам нужно char * из этого, просто используйте .c_str()

const char* cstr = decodedString.c_str();

Если вам нужно передать это функции, которая принимает char* в качестве входных данных, например:

void someFunc(char* data);
//...
//call site
someFunc( &decodedString[0] );

У нас есть ТОННА функций, абстракций и контейнеров на C ++, которые были созданы для улучшения языка C, чтобы программистам не приходилось писать что-то вручную и делать одни и те же ошибки каждый раз, когда они кодируют. Было бы лучше, если бы мы использовали эти функции везде, где это возможно, чтобы избежать сырых циклов или сделать такие простые модификации, как это.

2 голосов
/ 13 июля 2020

Вы пишете за пределами последнего элемента выделенного массива, что может привести к тому, что произойдёт буквально всё (в соответствии со стандартом C ++). Вам нужно decodedChar[decodedData.size()] = 0;

...