Я пишу простое консольное приложение в 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
?).
У кого-нибудь есть идеи?
Спасибо вперед!
Глядя на первую версию:
Что заставляет вас думать, что tellg
получает размер потока? Это не так возвращает текущую позицию чтения. Затем вы продолжаете давать указатель на ваши данные buff.CryptoContents
и незамедлительно удалите указанные данные! Это очень опасная практика; Вам необходимо скопировать данные, использовать интеллектуальный указатель или иным образом убедиться, что данные имеют правильный срок службы. Вероятно, удаление приводит к тому, что ваши данные помечаются маркером, чтобы показать, что они были удалены, если вы работаете в режиме отладки, поэтому вы получаете поток идентичных символов.
Я подозреваю, что ваше предложение о подписанных и неподписанных может быть верным на секунду, но я не могу сказать, не увидев ваш файл и данные.
Вы устанавливаете CryptoContext, чтобы указать на ваши данные byte
указатель, и после этого вы удаляете эти данные!
buff.CryptoContext = (byte*)oData;
delete[] oData;
После этой строки CryptoContext указывает на освобожденные и недействительные данные. Просто держи oData
Массив больше в памяти и удалите его после того, как вы закончили с декодированием или чем бы вы ни занимались