Проблемы при попытке чтения переполнения стека двоичных файлов

Я пишу простое консольное приложение в Visual Studio C ++. Я хочу прочитать двоичный файл с .cer расширение до байтового массива.

ifstream inFile;
size_t size = 0;
char* oData = 0;
inFile.open(path, ios::in|ios::binary);

if (inFile.is_open())
{
size = inFile.tellg();     // get the length of the file
oData = new char[size+1];  //  for the '\0'
inFile.read( oData, size );
oData[size] = '\0' ;       // set '\0'

inFile.close();
buff.CryptoContext = (byte*)oData;
delete[] oData;
}

Но когда я запускаю его, я получаю во всех oData символы один и тот же символ, каждый раз еще один, например:

oData = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...".

Тогда я попробовал другой способ:

std::ifstream in(path, std::ios::in | std::ios::binary);

if (in)
{
std::string contents;

in.seekg(0, std::ios::end);
contents.resize(in.tellg());

in.seekg(0, std::ios::beg);
in.read(&contents[0], contents.size());

in.close();
}

Теперь содержимое имеет очень странные значения: часть значений является правильной, а часть — отрицательными и странными значениями (возможно, это связано с signed char а также unsigned char?).

У кого-нибудь есть идеи?

Спасибо вперед!

0

Решение

Глядя на первую версию:

Что заставляет вас думать, что tellg получает размер потока? Это не так возвращает текущую позицию чтения. Затем вы продолжаете давать указатель на ваши данные buff.CryptoContents и незамедлительно удалите указанные данные! Это очень опасная практика; Вам необходимо скопировать данные, использовать интеллектуальный указатель или иным образом убедиться, что данные имеют правильный срок службы. Вероятно, удаление приводит к тому, что ваши данные помечаются маркером, чтобы показать, что они были удалены, если вы работаете в режиме отладки, поэтому вы получаете поток идентичных символов.

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

1

Другие решения

Вы устанавливаете CryptoContext, чтобы указать на ваши данные byte указатель, и после этого вы удаляете эти данные!

buff.CryptoContext = (byte*)oData;
delete[] oData;

После этой строки CryptoContext указывает на освобожденные и недействительные данные. Просто держи oData Массив больше в памяти и удалите его после того, как вы закончили с декодированием или чем бы вы ни занимались

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector