在这里,病态会清楚地解释我将要做什么。

我有一个文本文件,前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个字节上提供一些随机数据。

下图显示了来自同一文本文件的一些读数。

在此处输入图片说明

这到底是怎么回事。 我无法弄清楚这种奇怪行为的原因。

===============>>#1 票数:5 已采纳

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

修复这两种情况的方法是强制其显式使用std::string(const char*, size_type)构造函数: QString::fromStdString(std::string(salt, 16))

===============>>#2 票数:2

可能缺少空字符?

即代码应该是

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

  ask by danial weaber translate from so

未解决问题?本站智能推荐: