Что выполняет эта строчка в Qt? sendStream.device()->seek(0)

Рейтинг: 0Ответов: 1Опубликовано: 25.02.2015

Что выполняет эта строчка в Qt?

sendStream.device()->seek(0);

Вот вся функция:

void SocketAdapter::sendString(const QString& str) {
  QByteArray block;
  QDataStream sendStream(&block, QIODevice::ReadWrite);

  sendStream << quint16(0) << str;
  sendStream.device()->seek(0);
  sendStream << (quint16)(block.size() - sizeof(quint16));
  m_ptcpSocket->write(block);
}

Ответы

▲ 1

В общем, ситуация такова:

У вас вместо устройства в QDataStream передается QByteArray (внутри он оборачивается в QBuffer, ибо сам QByteArray не является наследником от QIODevice -- http://qt-project.org/doc/qt-4.8/qdatastream.html#QDataStream-4)

Далее вы перепрыгиваете 16 бит, записывая туда нули, а затем строку (sendStream << quint16(0) << str;)

Следующий шаг вы обращаетесь к вашему устройству, которым на самом деле является QByteArray, завернутый в QBuffer, и т.к. он поддерживает доступ к случайным битам, переходите на его нулевой адрес - самое начало вашего массива байт (туда, где ваш курсор находился до записи первых 16 бит и строки).

Затем вы вычисляет размер записанной в массив строки (block.size() - sizeof(quint16) -- общий размер записанных данных - 16 бит) и записываете его на место тех первых 16 бит, которые в начале нулями заполнили.

Отправляете все это дело по tcp...


Если схематично описать все действия, то будет примерно так:

Инициализировал наш массив -- []
Записали 16 бит с нулем и строку -- [00|str]
                                           ^
при этом наш курсор оказался в конце массива, а мы хотим передвинуть его в начало
Для этого делаем device().seek(0) -- [00|str]
                                      ^
И уже за тем записываем на месте первых 16 бит, которые мы отступили в начале размер всего нашего массива [00|str] минус размер переменной этих 16 бит [0.. т.е. размер всех данных после этих 16 бит -- ..str]

Тем самым в сеть утечет размер строки и сама строка.

Мне не очень ясно, почему вы так это дело организовали, но если вам так хочется...