为什么二进制文件I / O会在读取时提供一些随机数据

时间:2015-05-17 11:01:16

标签: c++

这里我清楚地解释了我要做什么。

我有一个文本文件,前16个字节包含一个名为salt的东西,接下来的32个字节包含一个名为iv的东西。 (这些东西与加密有关,而不是这里的问题。)

below is how the text file looks like.

现在我使用下面的代码将它们读入两个char数组,以便将它们分开。

   ifstream infile ("salt.txt" , std::ios::binary );


   char* salt = new char[16];
   char* iv = new char[32];

   infile.read(salt , 16 );
   infile.seekg(16, ios::beg);
   infile.read(iv, 32  );

   ui->textEdit_3->append("salt : "+ QString::fromStdString(salt) );
   ui->textEdit_3->append("iv : "+ QString::fromStdString(iv) + "\n\n" );
   infile.close();

我使用Qt进行gui设计,后三行用于在文本编辑中显示结果。

当我多次读取同一文本文件时,它会在最后4或5个字节上提供一些随机数据。

下图显示了从同一文本文件中获取的一些读数。

enter image description here

这件事真的发生在这里。我无法弄清楚这种奇怪行为的原因。

2 个答案:

答案 0 :(得分:5)

QString::fromStdStringstd::string作为参数。由于您将char *传递给它,因此将使用std::string构造函数将其隐式转换为std::string(const char*)。问题是它会查找一个空字符作为字符串终止符。这意味着如果您读取的数据包含空字符,它将提前终止或(很可能是此处发生的情况)它将超过您的salt缓冲区,直到它在内存中找到随机空字符。

在任何一种情况下修复它的方法是强制它明确使用std::string(const char*, size_type)构造函数:QString::fromStdString(std::string(salt, 16))

答案 1 :(得分:2)

可能缺少空字符?

即。代码应该是

char* salt = new char[17];
char* iv = new char[33];
iv[32] = salt[16] = 0;