Как использовать QDataStream::readBytes()

Согласно документации для readBytes() (в QDataStream Qt 5.4), Я ожидаю, что следующий код скопирует input_array во вновь выделенную память и укажет raw на копию:

QByteArray input_array{"\x01\x02\x03\x04qwertyuiop"};
QDataStream unmarshaller{&input_array, QIODevice::ReadOnly};

char* raw;
uint length;
unmarshaller.readBytes(raw, length);

qDebug() << "raw null? " << (raw == nullptr) << " ; length = " << length << endl;

... но код печатает raw null? true ; length = 0, указывая на то, что из входного массива не было прочитано ни одного байта.

Почему это? Что я неправильно понимаю в отношении readBytes()?


person Kyle Strand    schedule 14.04.2015    source источник
comment
Конструктору QByteArray нужен массив символов с нулевым завершением, если вы не укажете размер.   -  person cmannett85    schedule 15.04.2015
comment
@ cmannett85 А, спасибо. Но если я сначала прочитаю серию quint8, используя >>, я получу ожидаемые 1, 2, 3, 4, что, по-видимому, подразумевает, что я действительно строю ожидаемый QByteArray... верно?   -  person Kyle Strand    schedule 15.04.2015
comment
@ cmannett85 Кроме того, я могу распечатать QByteArray с помощью qDebug().   -  person Kyle Strand    schedule 15.04.2015
comment
@ cmannett85 Наконец, добавление \0 в конец строки конструктора input_array не меняет поведение кода.   -  person Kyle Strand    schedule 15.04.2015


Ответы (1)


Документация не описывает это достаточно четко, но QDataStream::readBytes предполагает, что данные должны быть в определенном формате: quint32 часть, которая представляет собой длину данных, а затем сами данные.

Таким образом, чтобы прочитать данные, используя QDataStream::readBytes, вы должны сначала записать их, используя QDataStream::writeBytes, или записать их любым другим способом, используя правильный формат.

Пример:

QByteArray raw_input = "\x01\x02\x03\x04qwertyuiop";

QByteArray ba;

QDataStream writer(&ba, QIODevice::WriteOnly);
writer.writeBytes(raw_input.constData(), raw_input.length());

QDataStream reader(ba);

char* raw;
uint length;
reader.readBytes(raw, length);

qDebug() << "raw null? " << (raw == NULL) << " ; length = " << length << endl;

Также вы можете использовать QDataStream::readRawData и QDataStream::writeRawData для чтения и записи произвольных данных.

person hank    schedule 15.04.2015
comment
Ах, я понял, что результирующий массив char будет начинаться с 4 байтов длины. - person Kyle Strand; 15.04.2015