Spec-Zone.ru › Qt 5.13

Класс QCborStreamReader

Класс QCborStreamReader представляет собой простой декодер потоков CBOR, работающий с QByteArray или QIODevice. Подробнее...

Заголовок: #include <QCborStreamReader>
qmake: QT += core
С момента: Qt 5.12

Этот класс был представлен в Qt 5.12.

  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются реентерабельными.

Открытые типы

класс StringResult
перечисление StringResultCode { КонецСтроки, Хорошо, Ошибка }
перечисление Type { БеззнаковоеЦелое, ОтрицательноеЦелое, БайтовыйМассив, СтрокаБайтов, ..., Неверный }

Открытые функции

QCborStreamReader(QIODevice *device)
QCborStreamReader(const QByteArray &data)
QCborStreamReader(const quint8 *data, qsizetype len)
QCborStreamReader(const char *data, qsizetype len)
QCborStreamReader()
~QCborStreamReader()
void addData(const QByteArray &data)
void addData(const char *data, qsizetype len)
void addData(const quint8 *data, qsizetype len)
void clear()
int containerDepth() const
qint64 currentOffset() const
qsizetype currentStringChunkSize() const
QIODevice * device() const
bool enterContainer()
bool hasNext() const
bool isArray() const
bool isBool() const
bool isByteArray() const
bool isContainer() const
bool isDouble() const
bool isFalse() const
bool isFloat16() const
bool isFloat() const
bool isInteger() const
bool isInvalid() const
bool isLengthKnown() const
bool isMap() const
bool isNegativeInteger() const
bool isNull() const
bool isSimpleType() const
bool isSimpleType(QCborSimpleType st) const
bool isString() const
bool isTag() const
bool isTrue() const
bool isUndefined() const
bool isUnsignedInteger() const
bool isValid() const
QCborError lastError()
bool leaveContainer()
quint64 length() const
bool next(int maxRecursion = 10000)
QCborStreamReader::Type parentContainerType() const
StringResult<QByteArray> readByteArray()
StringResult<QString> readString()
StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen)
void reparse()
void reset()
void setDevice(QIODevice *device)
bool toBool() const
double toDouble() const
qfloat16 toFloat16() const
float toFloat() const
qint64 toInteger() const
QCborNegativeInteger toNegativeInteger() const
QCborSimpleType toSimpleType() const
QCborTag toTag() const
quint64 toUnsignedInteger() const
QCborStreamReader::Type type() const

Подробное описание

Этот класс можно использовать для декодирования потока данных CBOR напрямую из QByteArray или QIODevice. CBOR — это компактное двоичное представление объектов, очень компактная форма двоичного кодирования данных, совместимая с JSON. Она была создана рабочей группой IETF Constrained RESTful Environments (CoRE), которая использовала ее во многих новых RFC. Она предназначена для использования вместе с протоколом CoAP.

QCborStreamReader предоставляет API, подобный StAX, аналогичный QXmlStreamReader. Его использование требует определённых знаний о кодировании CBOR. Для более простого API см. QCborValue и, особенно, функцию декодирования QCborValue::fromCbor().

Обычно объект QCborStreamReader создаётся путём передачи исходного QByteArray или QIODevice в качестве параметра конструктору, затем элементы из потока извлекаются, если при декодировании ошибок не было. Существует три типа CBOR:

Тип Типы данных Поведение
Фиксированной длины Целые числа, теги, простые типы, числа с плавающей точкой Значение предварительно анализируется QCborStreamReader, поэтому функции-акссесоры const. Необходимо вызвать next() для продвижения.
Строки Массивы байтов, текстовые строки Длина (если известна) предварительно анализируется, но сама строка — нет. Функции-акссесоры не являются константными и могут выделять память. После вызова функции-акссесоры автоматически переходят к следующему элементу.
Контейнеры Массивы, карты Длина (если известна) предварительно анализируется. Для доступа к элементам необходимо вызвать enterContainer(), прочитать все элементы, а затем вызвать leaveContainer(). Эта функция переходит к следующему элементу.

Таким образом, функция обработки обычно выглядит так:

   void handleStream(QCborStreamReader &reader)
   {
       switch (reader.type())
       case QCborStreamReader::UnsignedInteger:
       case QCborStreamReader::NegativeInteger:
       case QCborStreamReader::SimpleType:
       case QCborStreamReader::Float16:
       case QCborStreamReader::Float:
       case QCborStreamReader::Double:
           handleFixedWidth(reader);
           reader.next();
           break;
       case QCborStreamReader::ByteArray:
       case QCborStreamReader::String:
           handleString(reader);
           break;
       case QCborStreamReader::Array:
       case QCborStreamReader::Map:
           reader.enterContainer();
           while (reader.lastError() == QCborError::NoError)
               handleStream(reader);
           if (reader.lastError() == QCborError::NoError)
               reader.leaveContainer();
       }
   }

Поддержка CBOR

В следующей таблице перечислены функции CBOR, которые поддерживаются QCborStreamReader.

Функция Поддержка
Беззнаковые числа Да (полный диапазон)
Отрицательные числа Да (полный диапазон)
Строки байтов Да
Текстовые строки Да
Разбитые строки Да
Теги Да (произвольные)
Булевы значения Да
Null Да
Undefined Да
Произвольные простые значения Да
Числа с плавающей точкой половинной точности (16 бит) Да
Числа с плавающей точкой одинарной точности (32 бит) Да
Числа с плавающей точкой двойной точности (64 бит) Да
Бесконечности и NaN числа с плавающей точкой Да
Массивы и карты с определённой длиной Да
Массивы и карты с неопределённой длиной Да
Типы ключей карты, отличные от строк и целых чисел Да (произвольные)

Обработка недопустимых или неполных потоков CBOR

QCborStreamReader способен самостоятельно обнаруживать повреждённые входные данные. Используемая библиотека была тщательно протестирована на недопустимые входные данные любого типа и может сообщать об ошибках. Если ошибка обнаружена, QCborStreamReader установит lastError() в значение, отличное от QCborError::NoError, указывающее на обнаруженную ситуацию.

Большинство ошибок, обнаруженных QCborStreamReader во время нормального разбора элементов, необратимы. Код, использующий QCborStreamReader, может выбрать обработку правильно декодированных данных или может выбрать отбрасывание всех данных.

Единственная восстановимая ошибка — QCborError::EndOfFile, которая указывает на необходимость получения дополнительных данных для завершения разбора. Эта ситуация полезна, когда данные считываются из асинхронного источника, такого как канал (QProcess) или сокет (QTcpSocket, QUdpSocket, QNetworkReply и т. д.). При поступлении дополнительных данных окружающий код должен вызвать либо addData(), если разбор выполняется из QByteArray, либо reparse(), если вместо этого он считывает непосредственно QIODevice, в котором теперь есть доступные данные (см. setDevice()).

См. также QCborStreamWriter, QCborValue и QXmlStreamReader.

Документация по типам членов

перечисление QCborStreamReader::StringResultCode

Это перечисление возвращается readString() и readByteArray() и используется для указания состояния разбора.

Постоянная Значение Описание
QCborStreamReader::EndOfString 0 Разбор строки завершен без ошибок.
QCborStreamReader::Ok 1 Функция вернула данные; ошибок не было.
QCborStreamReader::Error -1 Разбор завершился с ошибкой.

перечисление QCborStreamReader::Type

Это перечисление содержит все возможные типы CBOR, декодированные QCborStreamReader. CBOR имеет 7 основных типов, а также ряд простых типов, не несущих значения, и значения с плавающей точкой.

Постоянная Значение Описание
QCborStreamReader::UnsignedInteger 0x00 (Основной тип 0) Диапазон от 0 до 264 - 1 (18 446 744 073 709 551 616)
QCborStreamReader::NegativeInteger 0x20 (Основной тип 1) Диапазон от -1 до -264 (-18 446 744 073 709 551 616)
QCborStreamReader::ByteArray ByteString (Основной тип 2) Произвольные двоичные данные.
QCborStreamReader::ByteString 0x40 Псевдоним для ByteArray.
QCborStreamReader::String TextString (Основной тип 3) Текст Unicode, возможно содержащий NUL.
QCborStreamReader::TextString 0x60 Псевдоним для String
QCborStreamReader::Array 0x80 (Основной тип 4) Массив разнородных элементов.
QCborStreamReader::Map 0xa0 (Основной тип 5) Карта/словарь разнородных элементов.
QCborStreamReader::Tag 0xc0 (Основной тип 6) Числа, добавляющие семантическое значение общим элементам CBOR. См. QCborTag для получения дополнительной информации.
QCborStreamReader::SimpleType 0xe0 (Основной тип 7) Типы, не несущие дополнительного значения. Включает булевы значения (true и false), null, undefined.
QCborStreamReader::Float16 HalfFloat IEEE 754 число с плавающей точкой половинной точности (qfloat16).
QCborStreamReader::HalfFloat 0xf9 Псевдоним для Float16.
QCborStreamReader::Float 0xfa IEEE 754 число с плавающей точкой одинарной точности (float).
QCborStreamReader::Double 0xfb IEEE 754 число с плавающей точкой двойной точности (double).
QCborStreamReader::Invalid 0xff Неверный тип, либо из-за ошибки разбора, либо из-за достижения конца массива или карты.

Документация по функциям-членам

QCborStreamReader::QCborStreamReader(QIODevice *device)

Это перегруженная функция.

Создаёт объект QCborStreamReader, который будет анализировать поток CBOR, полученный путём чтения из device. QCborStreamReader не получает права собственности на device, поэтому он должен оставаться валидным до уничтожения этого объекта.

QCborStreamReader::QCborStreamReader(const QByteArray &data)

Это перегруженная функция.

Создаёт объект QCborStreamReader, который будет анализировать поток CBOR, полученный из data.

QCborStreamReader::QCborStreamReader(const quint8 *data, qsizetype len)

Это перегруженная функция.

Создаёт объект QCborStreamReader с len байтами данных, начиная с data. Указатель должен оставаться валидным до уничтожения QCborStreamReader.

QCborStreamReader::QCborStreamReader(const char *data, qsizetype len)

Это перегруженная функция.

Создаёт объект QCborStreamReader с len байтами данных, начиная с data. Указатель должен оставаться валидным до уничтожения QCborStreamReader.

QCborStreamReader::QCborStreamReader()

Создаёт объект QCborStreamReader без исходных данных. После создания QCborStreamReader будет сообщать об ошибке разбора.

END_OF_DOCUMENT_MARKER

Вы можете добавить больше данных, вызвав addData() или установив другое устройство источника с помощью setDevice().

См. также addData() и isValid().

QCborStreamReader::~QCborStreamReader()

Уничтожает этот объект QCborStreamReader и освобождает все связанные ресурсы.

void QCborStreamReader::addData(const QByteArray &data)

Добавляет data к потоку CBOR и повторно анализирует текущий элемент. Эта функция полезна, если при обработке потока ранее был достигнут конец данных, но теперь доступны дополнительные данные.

void QCborStreamReader::addData(const char *data, qsizetype len)

Это перегруженная функция.

Добавляет len байтов данных, начиная с data, в поток CBOR и повторно анализирует текущий элемент. Эта функция полезна, если при обработке потока ранее был достигнут конец данных, но теперь доступны дополнительные данные.

void QCborStreamReader::addData(const quint8 *data, qsizetype len)

Это перегруженная функция.

Добавляет len байтов данных, начиная с data, в поток CBOR и повторно анализирует текущий элемент. Эта функция полезна, если при обработке потока ранее был достигнут конец данных, но теперь доступны дополнительные данные.

void QCborStreamReader::clear()

Очищает состояние декодера и сбрасывает входные данные источника до пустого массива байтов. После вызова этой функции QCborStreamReader будет указывать на ошибку в процессе парсинга.

Вызовите addData(), чтобы добавить больше данных для парсинга.

См. также reset() и setDevice().

int QCborStreamReader::containerDepth() const

Возвращает количество контейнеров, в которые этот поток вошёл с помощью enterContainer(), но ещё не покинул.

См. также enterContainer() и leaveContainer().

qint64 QCborStreamReader::currentOffset() const

Возвращает смещение в входном потоке элемента, который в настоящее время декодируется. Текущее смещение является количеством декодированных байтов только в том случае, если исходные данные — QByteArray, или это QIODevice, который был помещён в начало при запуске декодирования.

См. также reset(), clear() и device().

qsizetype QCborStreamReader::currentStringChunkSize() const

Возвращает размер текущего фрагмента текстовой или байтовой строки. Если поток CBOR содержит строку без фрагментации (то есть, если isLengthKnown() возвращает true), эта функция возвращает размер всей строки, такой же, как length().

Эта функция полезна для предварительного выделения буфера, указатель которого может быть передан в readStringChunk() позже.

См. также readString(), readByteArray() и readStringChunk().

QIODevice *QCborStreamReader::device() const

Возвращает QIODevice, который был установлен с помощью setDevice() или конструктора QCborStreamReader. Если этот объект считывал данные из QByteArray, эта функция возвращает nullptr.

См. также setDevice().

bool QCborStreamReader::enterContainer()

Входит в массив или словарь, который является текущим элементом, и готовится к итерации по элементам, содержащимся в контейнере. Возвращает true, если вход в контейнер выполнен успешно, false в противном случае (обычно, ошибка парсинга). Каждый вызов enterContainer() должен быть сопряжён с вызовом leaveContainer().

Эта функция может быть вызвана только если текущий элемент является массивом или словарем (то есть, если isArray(), isMap() или isContainer() вернёт true). Вызов в любом другом случае является ошибкой.

См. также leaveContainer(), isContainer(), isArray() и isMap().

bool QCborStreamReader::hasNext() const

Возвращает true, если в текущем контейнере есть ещё элементы для декодирования, или false, если мы достигли его конца. Если мы парсим корневой элемент, hasNext() возвращает false, что указывает на завершение парсинга; в противном случае, если глубина контейнера не равна нулю, внешний код должен вызвать leaveContainer().

См. также parentContainerType(), containerDepth() и leaveContainer().

bool QCborStreamReader::isArray() const

Возвращает true, если тип текущего элемента — массив (то есть, если type() возвращает QCborStreamReader::Array). Если эта функция возвращает true, вы можете вызвать enterContainer(), чтобы начать парсинг этого контейнера.

Когда текущий элемент является массивом, вы также можете вызвать isLengthKnown(), чтобы узнать, явлен ли размер массива в потоке CBOR. Если да, этот размер можно получить, вызвав length().

Следующий пример предварительно выделяет QVariantList с учётом размера массива для более эффективного декодирования:

   QVariantList populateFromCbor(QCborStreamReader &reader)
   {
       QVariantList list;
       if (reader.isLengthKnown())
           list.reserve(reader.length());

       reader.enterContainer();
       while (reader.lastError() == QCborError::NoError && reader.hasNext())
           list.append(readOneElement(reader));
       if (reader.lastError() == QCborError::NoError)
           reader.leaveContainer();
   }

Примечание: Приведённый выше код не проверяет, является ли длина разумной. Если входной поток сообщает, что длина составляет миллиард элементов, вышеприведенная функция попытается выделить 16 ГБ или более оперативной памяти, что может привести к сбою.

См. также type(), isMap(), isLengthKnown(), length(), enterContainer() и leaveContainer().

bool QCborStreamReader::isBool() const

Возвращает true, если текущий элемент — булево значение (true или false), false — в противном случае. Если эта функция возвращает true, вы можете вызвать toBool(), чтобы получить значение булевого типа. Вы также можете вызвать toSimpleType() и сравнить с QCborSimpleValue::True или QCborSimpleValue::False.

См. также type(), isFalse(), isTrue(), toBool(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isByteArray() const

Возвращает true, если тип текущего элемента — массив байтов (то есть, если type() возвращает QCborStreamReader::ByteArray). Если эта функция возвращает true, вы можете вызвать readByteArray(), чтобы считать эти данные.

См. также type(), readByteArray() и isString().

bool QCborStreamReader::isContainer() const

Возвращает true, если текущий элемент — контейнер (массив или словарь), false — в противном случае. Если текущий элемент является контейнером, функция isLengthKnown() может быть использована для определения того, явлен ли размер контейнера в потоке, а если да, то length() может быть использована для получения этого размера.

Более важно, что для контейнера доступна функция enterContainer() для начала итерации по элементам, содержащимся в нём.

См. также type(), isArray(), isMap(), isLengthKnown(), length(), enterContainer(), leaveContainer() и containerDepth().

bool QCborStreamReader::isDouble() const

Возвращает true, если тип текущего элемента — число с плавающей точкой двойной точности IEEE 754 (то есть, если type() возвращает QCborStreamReader::Double). Если эта функция возвращает true, вы можете вызвать toDouble(), чтобы считать эти данные.

См. также type(), toDouble(), isFloat16() и isFloat().

bool QCborStreamReader::isFalse() const

Возвращает true, если текущий элемент имеет значение false, false в противном случае.

См. также type(), isTrue(), isBool(), toBool(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isFloat16() const

Возвращает true, если тип текущего элемента — плавающей точки одинарной точности IEEE 754 (то есть, если type() возвращает QCborStreamReader::Float16). Если функция возвращает true, можно вызвать toFloat16() для чтения данных.

См. также type(), toFloat16(), isFloat() и isDouble().

bool QCborStreamReader::isFloat() const

Возвращает true, если тип текущего элемента — плавающей точки одинарной точности IEEE 754 (то есть, если type() возвращает QCborStreamReader::Float). Если функция возвращает true, можно вызвать toFloat() для чтения данных.

См. также type(), toFloat(), isFloat16() и isDouble().

bool QCborStreamReader::isInteger() const

Возвращает true, если тип текущего элемента — целое число с беззнаковым или отрицательным значением (то есть, если type() возвращает QCborStreamReader::UnsignedInteger или QCborStreamReader::NegativeInteger). Если функция возвращает true, можно вызвать toInteger() для чтения значения.

См. также type(), toInteger(), toUnsignedInteger(), toNegativeInteger(), isUnsignedInteger() и isNegativeInteger().

bool QCborStreamReader::isInvalid() const

Возвращает true, если текущий элемент недействителен, false в противном случае. Текущий элемент может быть недействительным, если произошла ошибка декодирования или если был проанализирован последний элемент в массиве или словаре.

Примечание: Не следует путать эту функцию с isNull(). Null — это обычный тип CBOR, который должен обрабатываться приложением.

См. также type() и isValid().

bool QCborStreamReader::isLengthKnown() const

Возвращает true, если длина текущего массива, словаря, массива байтов или строки известна (явная в потоке CBOR), false в противном случае. Эту функцию следует вызывать только в случае, если элемент является одним из этих типов.

Если длина известна, её можно получить, вызвав length().

Если длина словаря или массива неизвестна, она подразумевается количеством элементов в потоке. QCborStreamReader не имеет API для вычисления длины в этом случае.

У строк и массивов байтов также может быть неопределённая длина (то есть, они могут передаваться частями). В настоящее время они не могут быть созданы с помощью QCborStreamWriter, но они могут быть созданы с другими кодерами, поэтому QCborStreamReader поддерживает их.

См. также length(), QCborStreamWriter::startArray() и QCborStreamWriter::startMap().

bool QCborStreamReader::isMap() const

Возвращает true, если тип текущего элемента — словарь (то есть, если type() возвращает QCborStreamReader::Map). Если функция возвращает true, можно вызвать enterContainer() для начала анализа этого контейнера.

При текущем элементе, являющемся словарем, также можно вызвать isLengthKnown(), чтобы узнать, явное ли значение размера словаря в потоке CBOR. Если это так, его можно получить, вызвав length().

В следующем примере QVariantMap предварительно выделяется с учётом размера словаря для более эффективной декодировки:

   QVariantMap populateFromCbor(QCborStreamReader &reader)
   {
       QVariantMap map;
       if (reader.isLengthKnown())
           map.reserve(reader.length());

       reader.enterContainer();
       while (reader.lastError() == QCborError::NoError && reader.hasNext()) {
           QString key = readElementAsString(reader);
           map.insert(key, readOneElement(reader));
       }
       if (reader.lastError() == QCborError::NoError)
           reader.leaveContainer();
   }

В примере выше используется функция, называемая readElementAsString, для чтения ключей словаря и получения строки. Это происходит потому, что ключи CBOR-словрей могут содержать любые типы, а не только строки. Код пользователя должен либо выполнить это преобразование, отклонить нестроковые ключи, либо вместо этого использовать другой контейнер помимо QVariantMap и QVariantHash. Например, если ожидается, что словарь будет содержать целочисленные ключи, что рекомендуется, так как это уменьшает размер потока и время парсинга, соответствующим контейнером будет \l{QMap}<int, QVariant> или \l{QHash}<int, QVariant>.

Примечание: Приведённый выше код не проверяет, является ли длина разумной. Если входной поток сообщает, что длина составляет 1 миллиард элементов, вышеуказанная функция попытается выделить около 24 ГБ или более оперативной памяти, что может привести к сбою.

См. также type(), isArray(), isLengthKnown(), length(), enterContainer() и leaveContainer().

bool QCborStreamReader::isNegativeInteger() const

Возвращает true, если тип текущего элемента — отрицательное целое число (то есть, если type() возвращает QCborStreamReader::NegativeInteger). Если функция возвращает true, можно вызвать toNegativeInteger() или toInteger() для чтения значения.

См. также type(), toNegativeInteger(), toInteger(), isInteger() и isUnsignedInteger().

bool QCborStreamReader::isNull() const

Возвращает true, если текущий элемент имеет значение null, false в противном случае. Значения null могут использоваться для обозначения отсутствия некоторых необязательных данных.

Примечание: Эта функция не является противоположностью isValid(). Значение Null является допустимым значением CBOR.

См. также type(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isSimpleType() const

Возвращает true, если тип текущего элемента — любой простой тип CBOR, включая логическое значение (true и false), а также null и undefined. Чтобы узнать, какой это простой тип, вызовите toSimpleType(). В качестве альтернативы, чтобы проверить один конкретный простой тип, вызовите перегрузку, которая принимает параметр QCborSimpleType.

Простые типы CBOR — это типы, которые не переносят дополнительных значений. Существует 255 возможностей, но в настоящее время только четыре значения имеют определённое значение. От ожидаемого кода не требуется обращаться с неизвестными простыми типами, и он может просто отклонить поток как недействительный, если обнаружит неизвестный.

См. также QCborSimpleType, type(), isSimpleType(QCborSimpleType) и toSimpleType().

bool QCborStreamReader::isSimpleType(QCborSimpleType st) const

Возвращает true, если тип текущего элемента — простой тип st, false в противном случае. Если функция возвращает true, то toSimpleType() вернёт st.

Простые типы CBOR — это типы, которые не переносят дополнительных значений. Существует 255 возможностей, но в настоящее время только четыре значения имеют определённое значение. От ожидаемого кода не требуется обращаться с неизвестными простыми типами, и он может просто отклонить поток как недействительный, если обнаружит неизвестный.

См. также QCborSimpleType, type(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isString() const

Возвращает true, если тип текущего элемента — текстовая строка (то есть, если type() возвращает QCborStreamReader::String). Если функция возвращает true, можно вызвать readString() для чтения данных.

См. также type(), readString() и isByteArray().

bool QCborStreamReader::isTag() const

Возвращает true, если тип текущего элемента — тег CBOR (то есть, если type() возвращает QCborStreamReader::Tag). Если функция возвращает true, можно вызвать toTag() для чтения данных.

См. также type() и toTag().

bool QCborStreamReader::isTrue() const

Возвращает true, если текущий элемент имеет значение true, false в противном случае.

См. также type(), isFalse(), isBool(), toBool(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isUndefined() const

Возвращает true, если текущий элемент имеет значение undefined, и false в противном случае. Значения undefined могут быть закодированы, чтобы указать, что некоторая конвертация завершилась неудачно или не была возможной при создании потока. QCborStreamReader никогда не выполняет замену, и эта функция вернёт true только если поток содержит явное значение undefined.

См. также type(), isSimpleType() и toSimpleType().

bool QCborStreamReader::isUnsignedInteger() const

Возвращает true, если тип текущего элемента — целое беззнаковое число (то есть, если type() возвращает QCborStreamReader::UnsignedInteger). Если эта функция возвращает true, вы можете вызвать toUnsignedInteger() или toInteger() для чтения этого значения.

См. также type(), toUnsignedInteger(), toInteger(), isInteger() и isNegativeInteger().

bool QCborStreamReader::isValid() const

Возвращает true, если текущий элемент допустим, и false в противном случае. Текущий элемент может быть недопустимым, если произошла ошибка декодирования или мы только что обработался последний элемент в массиве или словаре.

Примечание: Эта функция не является противоположностью isNull(). Null — это обычный тип CBOR, который должен обрабатываться приложением.

См. также type() и isInvalid().

QCborError QCborStreamReader::lastError()

Возвращает последнюю ошибку при декодировании потока, если таковая имеется. Если ошибок не было, возвращается QCborError::NoError.

См. также isValid().

bool QCborStreamReader::leaveContainer()

Выходит из массива или словаря, элементы которого обрабатывались, и позиционирует декодер на следующий элемент после конца контейнера. Возвращает true, если выход из контейнера выполнен успешно, и false в противном случае (обычно, при ошибке парсинга). Каждый вызов enterContainer() должен быть спарен с вызовом leaveContainer().

Эта функция может быть вызвана только если hasNext() вернула false и containerDepth() не равно нулю. Вызов в иных условиях является ошибкой.

См. также enterContainer(), parentContainerType() и containerDepth().

quint64 QCborStreamReader::length() const

Возвращает длину строки или массива байтов, или количество элементов в массиве, или количество пар элементов в словаре, если известно. Эта функция не должна вызываться, если длина неизвестна (то есть, если isLengthKnown() вернула false). Вызов в этом случае является ошибкой, и это приведёт к тому, что QCborStreamReader прекратит парсинг входного потока.

См. также isLengthKnown(), QCborStreamWriter::startArray() и QCborStreamWriter::startMap().

bool QCborStreamReader::next(int maxRecursion = 10000)

Перемещает декодирование CBOR-потока на один элемент. Обычно вы должны вызывать эту функцию при парсинге элементов с фиксированной шириной (целые числа, простые значения, теги и числа с плавающей запятой). Но эту функцию можно вызывать и когда текущий элемент — строка, массив или словарь, и она пропустит весь этот элемент, включая все вложенные элементы.

Эта функция возвращает true, если перемещение было успешным, и false в противном случае. Она может завершиться неудачей, если поток повреждён, неполный или если уровень вложенности массивов и словарей превышает maxRecursion. Вызов этой функции, когда hasNext() вернула false, также является ошибкой. Если эта функция вернула false, lastError() вернёт код ошибки, описывающий причину неудачи.

См. также lastError(), isValid() и hasNext().

QCborStreamReader::Type QCborStreamReader::parentContainerType() const

Возвращает либо QCborStreamReader::Array, либо QCborStreamReader::Map, указывая, являлся ли контейнер, содержащий текущий элемент, массивом или словарем соответственно. Если мы в настоящее время парсим корневой элемент, эта функция возвращает QCborStreamReader::Invalid.

См. также containerDepth() и enterContainer().

StringResult<QByteArray> QCborStreamReader::readByteArray()

Декодирует один фрагмент массива байтов из CBOR-строки и возвращает его. Эта функция используется для обычных и фрагментированных содержимых, поэтому вызывающая сторона должна всегда повторять вызовы этой функции, даже если isLengthKnown() имеет значение true. Типичное использование этой функции таково:

   QBytearray decodeBytearray(QCborStreamReader &reader)
   {
       QBytearray result;
       auto r = reader.readBytearray();
       while (r.code == QCborStreamReader::Ok) {
           result += r.data;
           r = reader.readByteArray();
       }

       if (r.code == QCborStreamReader::Error) {
           // handle error condition
           result.clear();
       }
       return result;
   }

Эта функция не выполняет никаких преобразований типов, включая преобразования из целых чисел или строк. Поэтому её можно вызывать только если isByteArray() имеет значение true; вызов в иных условиях является ошибкой.

См. также readString(), isByteArray() и readStringChunk().

StringResult<QString> QCborStreamReader::readString()

Декодирует один фрагмент строки из CBOR-строки и возвращает его. Эта функция используется для обычных и фрагментированных содержимых строк, поэтому вызывающая сторона должна всегда повторять вызовы этой функции, даже если isLengthKnown() имеет значение true. Типичное использование этой функции таково:

   QString decodeString(QCborStreamReader &reader)
   {
       QString result;
       auto r = reader.readString();
       while (r.code == QCborStreamReader::Ok) {
           result += r.data;
           r = reader.readString();
       }

       if (r.code == QCborStreamReader::Error) {
           // handle error condition
           result.clear();
       }
       return result;
   }

Эта функция не выполняет никаких преобразований типов, включая преобразования из целых чисел или массивов байтов. Поэтому её можно вызывать только если isString() вернуло true; вызов в иных условиях является ошибкой.

См. также readByteArray(), isString() и readStringChunk().

StringResult<qsizetype> QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen)

Считывает текущий фрагмент строки в буфер, указанный ptr, размер которого — maxlen. Эта функция возвращает объект StringResult, в члене StringResult::data которого сохраняется количество скопированных байтов в ptr. Член StringResult::status указывает, была ли ошибка при чтении строки, были ли скопированы данные или это последний фрагмент.

Эта функция может вызываться для типов String и ByteArray. Для последнего, эта функция будет считывать те же данные, которые вернула бы readByteArray(). Для строк возвращается UTF-8 эквивалент QString, который бы был возвращён.

Эта функция обычно используется совместно с currentStringChunkSize() в цикле. Например:

    QCborStreamReader<qsizetype> result;
    do {
        qsizetype size = reader.currentStringChunkSize();
        qsizetype oldsize = buffer.size();
        buffer.resize(oldsize + size);
        result = reader.readStringChunk(buffer.data() + oldsize, size);
    } while (result.status() == QCborStreamReader::Ok);

В отличие от readByteArray() и readString(), эта функция не ограничена пределами реализации QByteArray и QString.

Примечание: Эта функция не проверяет корректность форматирования UTF-8 содержимого. Это означает, что эта функция не генерирует ошибку QCborError::InvalidUtf8String, даже когда readString() её генерирует.

См. также currentStringChunkSize(), readString(), readByteArray(), isString() и isByteArray().

void QCborStreamReader::reparse()

Перепарсирует текущий элемент. Эта функция должна быть вызвана, когда становится доступно больше данных в источнике QIODevice после того, как парсинг завершился неудачно из-за достижения конца входных данных до конца CBOR-потока.

При чтении из QByteArray() функция addData() автоматически вызывает эту функцию. Вызов при отсутствии неудачи — это пустая операция.

void QCborStreamReader::reset()

Сбрасывает источник обратно к началу и очищает состояние декодера. Если исходные данные были QByteArray, QCborStreamReader перезапустится с начала массива.

Если исходные данные — QIODevice, эта функция вызовет QIODevice::reset(), которая переместит указатель на байтовую позицию 0. Если CBOR-поток не найден в начале устройства (например, в начале файла), то эта функция, вероятно, сделает неправильные действия. Вместо этого установите позицию QIODevice в нужное смещение и вызовите setDevice().

См. также clear() и setDevice().

void QCborStreamReader::setDevice(QIODevice *device)

Устанавливает источник данных в device, сбрасывая декодер в начальное состояние.

См. также device().

bool QCborStreamReader::toBool() const

Возвращает булево значение текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразование из целого числа. Поэтому её можно вызывать только если isTrue(), isFalse() или isBool() вернули true; вызов в любом другом случае является ошибкой.

См. также isBool(), isTrue(), isFalse(), и toInteger().

double QCborStreamReader::toDouble() const

Возвращает значение 64-битного двойной точности с плавающей запятой текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразования из других типов с плавающей запятой или из целых значений. Поэтому её можно вызывать только если isDouble() равно true; вызов в любом другом случае является ошибкой.

См. также isDouble(), toFloat16(), и toFloat().

qfloat16 QCborStreamReader::toFloat16() const

Возвращает значение 16-битного числа с плавающей запятой полуточной точности текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразования из других типов с плавающей запятой или из целых значений. Поэтому её можно вызывать только если isFloat16() равно true; вызов в любом другом случае является ошибкой.

См. также isFloat16(), toFloat(), и toDouble().

float QCborStreamReader::toFloat() const

Возвращает значение 32-битного числа с плавающей запятой одинарной точности текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразования из других типов с плавающей запятой или из целых значений. Поэтому её можно вызывать только если isFloat() равно true; вызов в любом другом случае является ошибкой.

См. также isFloat(), toFloat16(), и toDouble().

qint64 QCborStreamReader::toInteger() const

Возвращает целое значение текущего элемента, будь то отрицательное, положительное или нулевое. Если значение больше, чем 263 - 1 или меньше, чем -263, возвращаемое значение будет переполняться и будет иметь неправильный знак. Если требуется обработать эти значения, используйте toUnsignedInteger() или toNegativeInteger() вместо этого.

Эта функция не выполняет никаких преобразований типов, включая преобразования из булевых или тегов CBOR. Поэтому её можно вызывать только если isInteger() равно true; вызов в любом другом случае является ошибкой.

См. также isInteger(), toUnsignedInteger(), и toNegativeInteger().

QCborNegativeInteger QCborStreamReader::toNegativeInteger() const

Возвращает отрицательное целое значение текущего элемента. QCborNegativeValue — это 64-битное целое число без знака, содержащее абсолютное значение отрицательного числа, которое было хранилось в CBOR-потоке. Кроме того, QCborNegativeValue(0) представляет число -264.

Эта функция не выполняет никаких преобразований типов, включая преобразования из булевых или тегов CBOR. Поэтому её можно вызывать только если isNegativeInteger() равно true; вызов в любом другом случае является ошибкой.

Эта функция может быть использована для получения чисел, выходящих за пределы диапазона возвращаемого типа toInteger(). Однако использование отрицательных чисел меньше, чем -263 крайне не рекомендуется.

См. также type(), toInteger(), isNegativeInteger(), и isUnsignedInteger().

QCborSimpleType QCborStreamReader::toSimpleType() const

Возвращает значение текущего простого типа.

Эта функция не выполняет никаких преобразований типов, включая преобразования из целого числа. Поэтому её можно вызывать только если isSimpleType() равно true; вызов в любом другом случае является ошибкой.

См. также isSimpleType(), isTrue(), isFalse(), isBool(), isNull(), и isUndefined().

QCborTag QCborStreamReader::toTag() const

Возвращает значение тега текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразования из целого числа. Поэтому её можно вызывать только если isTag() равно true; вызов в любом другом случае является ошибкой.

Теги — это 64-битные числа, прикрепленные к общим CBOR-типам, которые придают им дополнительный смысл. Список известных тегов см. в перечислении QCborKnownTags.

См. также isTag(), toInteger(), и QCborKnownTags.

quint64 QCborStreamReader::toUnsignedInteger() const

Возвращает целое беззнаковое значение текущего элемента.

Эта функция не выполняет никаких преобразований типов, включая преобразования из булевых или тегов CBOR. Поэтому её можно вызывать только если isUnsignedInteger() равно true; вызов в любом другом случае является ошибкой.

Эта функция может быть использована для получения чисел, выходящих за пределы диапазона возвращаемого типа toInteger().

См. также type(), toInteger(), isUnsignedInteger(), и isNegativeInteger().

QCborStreamReader::Type QCborStreamReader::type() const

Возвращает тип текущего элемента. Он является одним из допустимых типов или Invalid.

См. также isValid(), isUnsignedInteger(), isNegativeInteger(), isInteger(), isByteArray(), isString(), isArray(), isMap(), isTag(), isSimpleType(), isBool(), isFalse(), isTrue(), isNull(), isUndefined(), isFloat16(), isFloat(), и isDouble().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qcborstreamreader.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API