Разница между QDataStream и QByteArray

QTemporaryFile tf;
tf.open ();
QDataStream tfbs (&tf);
tfbs << "hello\r\n" << "world!\r\n";
const int pos = int (tf.pos ());

QByteArray ba;
ba.append ("hello\r\n");
ba.append ("world!\r\n");
const int size = ba.size ();

В основном мой вопрос, что я делаю не так? Почему pos> размер? Должен ли я не использовать << ? Я не должен использовать QDataStream?

Изменить: Есть ли способ настроить QDataStream или QTeoraryFile так, чтобы << оператор не добавляет в строку строки длиной 32 бита и не сохраняет нулевые терминаторы в файле? Вызов QDataStream :: writeBytes, когда у меня просто есть серия строк в кавычках, а QStrings делает код очень уродливым.

3

Решение

Ответ в документах. Я не собираюсь переходить на QByteArray, так как считаю, что вполне очевидно, что он работает так, как ожидалось.

Оператор QDataStream<<(char *) перегрузка оценивается как функция writeBytes ().

Эта функция выводит:

Записывает спецификатор длины len и буфер s в поток и
возвращает ссылку на поток. Len сериализуется как квинт32,
затем следуют len байтов из s. Обратите внимание, что данные не закодированы.

Таким образом, для "hello\r\n"Я ожидаю, что результат будет:

0,0,0,8,'h','e','l','l','o','\r','\n',0

Длина 4 байта, за которой следуют байты из строки. NULL, заканчивающийся строкой, вероятно, также добавляется в конец, что будет содержать загадочные два дополнительных байта.

2

Другие решения

Поэтому я написал свой собственный вспомогательный класс для сериализации моих данных:

class QBinaryStream
{
public:
QBinaryStream (QIODevice& iod) : m_iod (iod) {}
QBinaryStream& operator << (const char* data)
{
m_iod.write (data);
return *this;
}
QBinaryStream& operator << (const QString& data)
{
return operator << (data.toUtf8 ());
}
QBinaryStream& operator << (const QByteArray& data)
{
m_iod.write (data);
return *this;
}

private:
QIODevice& m_iod;
};
0

Я не должен использовать QDataStream?

В вашем случае возможно QTextStream или даже QString сделал бы.

Класс QTextStream предоставляет удобный интерфейс для чтения и
написание текста.

QTextStream может работать с QIODevice, QByteArray или QString.
Используя потоковые операторы QTextStream, вы можете удобно читать и
писать слова, строки и цифры.

Что касается QByteArray, Qstring следует отдавать ему предпочтение, когда это возможно

Класс QByteArray предоставляет массив байтов.

QByteArray может использоваться для хранения как необработанных байтов (включая ‘\ 0), так и
традиционные 8-битные строки с символом \ 0. Использование QByteArray очень много
более удобно, чем использование const char *. За кулисами всегда
гарантирует, что за данными следует терминатор ‘\ 0’, и использует
неявное совместное использование (копирование при записи), чтобы уменьшить использование памяти и избежать
ненужное копирование данных.

В дополнение к QByteArray, Qt также предоставляет класс QString для хранения
строковые данные. Для большинства целей QString — это класс, который вы хотите использовать.
Он хранит 16-битные символы Unicode, что упрощает хранение
не-ASCII / не-Latin-1 символы в вашем приложении. Более того,
QString используется повсюду в Qt API. Два основных случая, когда
QByteArray подходит, когда вам нужно хранить необработанные двоичные данные,
и когда критично сохранение памяти (например, с помощью Qt для Embedded
Linux).

0
По вопросам рекламы [email protected]