我正在用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 :(得分:1)
您正在设置CryptoContext以通过byte
指针指向您的数据,然后删除该数据!
buff.CryptoContext = (byte*)oData;
delete[] oData;
此行之后,CryptoContext指向已释放和无效的数据。只需将oData
数组保留在内存中,并在完成解码或其他任何操作后将其删除。
答案 1 :(得分:1)
查看第一个版本:
是什么让你认为tellg
获得了流的大小?它没有,returns the current read position。然后,您继续将指向数据的指针发送到buff.CryptoContents
并立即删除指向的数据!这是非常危险的做法;您需要复制数据,使用智能指针或以其他方式确保数据具有正确的生命周期。如果您正在调试模式下运行,那么删除可能会使用标记来标记数据以显示它已被删除,这就是您获取相同字符流的原因。
我怀疑你对签名和未签名的建议可能是正确的,但我不能说没有看到你的文件和数据。