这里我清楚地解释了我要做什么。
我有一个文本文件,前16个字节包含一个名为salt的东西,接下来的32个字节包含一个名为iv的东西。 (这些东西与加密有关,而不是这里的问题。)
现在我使用下面的代码将它们读入两个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个字节上提供一些随机数据。
下图显示了从同一文本文件中获取的一些读数。
这件事真的发生在这里。我无法弄清楚这种奇怪行为的原因。
答案 0 :(得分:5)
QString::fromStdString
将std::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;