Проблема с QDataStream & QDataStream::operator>> ( char *& s)
QFile msnLogFile(item->data(Qt::UserRole).toString());
QDataStream logDataStream;
if(msnLogFile.exists()){
msnLogFile.open(QIODevice::ReadOnly);
logDataStream.setDevice(&msnLogFile);
QByteArray logBlock;
logDataStream >> logBlock;
}
Этот код не работает. QByte, который в результате пуст. То же самое, если я использую символ * . Достаточно странно, что тот же код работает в другой программе. Я пытаюсь найти разницу между ними. Это работает, если я использую int,uint, quint8 и т. Д.
2 ответа
Предполагая, что msnLogFile не был ранее создан с использованием QDataStream (если это так, то полностью игнорируйте этот ответ), вы не хотите использовать оператор >>.
Причина в том, что когда QDataStream пишет строки, он добавляет длину строки в выходные байты. Это позволяет другому QDataStream считывать его обратно с правильной длиной и получать тот же результат. Следовательно, почему int, qint8 и т. Д. Работают правильно; нет предопределенного размера, это просто необработанные данные.
Если содержимое msnLogFile строго текстовое, вам нужно передать флаг QIODevice::Text, чтобы открыть и использовать QIODevice::readLine() или QIODevice:: readAll (), однако, если это двоичные данные, вам придется использовать QDataStream::readRawData() и считывание данных в правильном порядке с правильными размерами.
Рискну предположить, что это потому, что вы не указываете версию протокола. Вам следует позвонить setVersion()
чтобы убедиться, что несколько компьютеров, которые могут использовать разные версии Qt, используют одну и ту же версию протокола.