Почему QByteArray читается из файла меньше, чем недавно загруженный QByteArray?
Я пытаюсь сравнить QByteArray
уже сохраненного файла HTML с QByteArray
это было только что загружено. Я должен преобразовать QString
содержимого файла в QByteArray
для того, чтобы сравнить их (или наоборот) и сравнение байтов кажется самым чистым методом, однако при преобразовании из QString
в QByteArray
размер нового QByteArray меньше, чем он должен быть. QByteArray QString::toLocal8Bit() const
утверждает, что если он не определен, символы будут подавлены или заменены. Он также сказал, что использует toLatin1()
по умолчанию и пытался использовать ASCII, так как это то, что кодируется в веб-сайте. Я все еще получаю те же результаты.
bool NewsBulletin::compareDownload(QByteArray new_contents, QString filename)
{
bool return_what = false;
qDebug() << "I am in compareDownload";
// qDebug() << new_contents[1];
// qDebug() << new_contents[1] << endl
// << new_contents[2];
QFile file(application_path + filename);
if (file.exists())
{
// QString new_contents_qstr(new_contents);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream in(&file);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("ASCII"));
QString file_contents = in.readAll();
QByteArray file_byte_array = file_contents.toLocal8Bit();
qDebug() << "outputting new file array";
qDebug() << new_contents[5] << new_contents.size();
qDebug() << "outputting old file array";
qDebug() << file_byte_array[5] << file_byte_array.size();
for (int i=0; i<=file_byte_array.size(); i++)
{
if (file_byte_array[i] != new_contents[i])
{
return_what = true;
break;
}
else if (i == file_byte_array.size())
{
qDebug() << "compareDownload will return false, duplicate file.";
return_what = false;
}
}
}
else
{
qDebug() << "compareDownload will return true, DNE.";
return_what = true;
}
return return_what;
}
Выход из qDebug()
из функции есть:
I am in compareDownload
outputting new file array
T 64704
outputting old file array
T 64576
1 ответ
Прочитав API в течение нескольких часов, я нашел причину, по которой байты разные.
file.open(QIODevice::ReadOnly | QIODevice::Text);
QIODevice::Text
должен быть удален. Этот флаг изменяет терминаторы конца строки на терминатор для cpp, "\n", таким образом, давая разницу в байтах.