Spec-Zone.ru › Qt 6.1

Класс QCborStreamReader

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

Заголовок: #include <QCborStreamReader>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С момента: Qt 5.12
  • Список всех членов, включая унаследованные

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

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

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

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

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(), если он вместо этого читает непосредственно QIDOevice, у которого теперь есть доступные дополнительные данные (см. setDevice()).

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

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

enum QCborStreamReader::StringResultCode

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

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

enum 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 сообщит об ошибке разбора.

Вы можете добавить больше данных, вызвав 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();
   }

Примечание: Приведенный выше код не проверяет, является ли длина разумной. Если входной поток сообщает, что длина составляет 1 миллиард элементов, вышеуказанная функция попытается выделить 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(). Нулевой элемент — это обычный тип 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 в противном случае. Неопределенные значения могут быть закодированы, чтобы указать, что при создании потока не удалось выполнить преобразование или оно было невозможно. QCborStreamReader никогда не выполняет замену, и эта функция вернет true только если поток содержит явное неопределенное значение.

См. также 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 со значением количества скопированных байтов в ptr, сохранённым в члене StringResult::data. Член 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() истинно; вызов в ином случае является ошибкой.

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

qfloat16 QCborStreamReader::toFloat16() const

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

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

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

float QCborStreamReader::toFloat() const

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

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

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

qint64 QCborStreamReader::toInteger() const

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

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

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

QCborNegativeInteger QCborStreamReader::toNegativeInteger() const

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

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

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

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

QCborSimpleType QCborStreamReader::toSimpleType() const

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

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

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

QCborTag QCborStreamReader::toTag() const

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

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

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

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

quint64 QCborStreamReader::toUnsignedInteger() const

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

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

Эта функция может быть использована для получения чисел, выходящих за пределы диапазона возвращаемого типа 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-6.1/qcborstreamreader.html

Spec-Zone.ru

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