0

我正在用 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?)。

有人有什么主意吗?

提前谢谢!

4

2 回答 2

1

您将 CryptoContext 设置为通过byte指针指向您的数据,然后删除该数据!

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

在这行之后 CryptoContext 指向已释放和无效的数据。只需在内存中保留oData更长的数组并在完成解码或使用它进行任何操作后将其删除。

于 2013-03-20T12:00:01.243 回答
1

看第一个版本:

是什么让您认为tellg获得了流的大小?它没有,它返回当前读取位置。然后,您继续指向您的数据指向buff.CryptoContents并立即删除指向的数据!这是非常危险的做法;您需要复制数据、使用智能指针或以其他方式确保数据具有正确的生命周期。如果您在调试模式下运行,则删除可能会用标记来显示您的数据已被删除,这就是您获得相同字符流的原因。

我怀疑你关于签名和未签名的建议可能是正确的,但我不能在没有看到你的文件和数据的情况下说。

于 2013-03-20T12:00:10.720 回答