Spec-Zone.ru › Qt 5.12

Класс QCborStreamReader

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

Заголовок: #include <QCborStreamReader>
qmake: QT += core
С момента: Qt 5.12
  • Список всех членов, включая наследуемые

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

Типы публичного доступа

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

Функции публичного доступа

QCborStreamReader()
QCborStreamReader(const char *data, qsizetype len)
QCborStreamReader(const quint8 *data, qsizetype len)
QCborStreamReader(const QByteArray &data)
QCborStreamReader(QIODevice *device)
QCborStreamReader(const 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
QCborStreamReader & operator=(const QCborStreamReader &)

Статические публичные члены

const QMetaObject staticMetaObject

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

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

Этот класс можно использовать для декодирования потока содержимого CBOR непосредственно из QByteArray или QIODevice. CBOR (Concise Binary Object Representation) — это очень компактный формат двоичного кодирования данных, совместимый с 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()

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

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

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

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

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

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

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

Это перегруженный метод.

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

QCborStreamReader::QCborStreamReader(const QByteArray &data)

Это перегруженный метод.

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

QCborStreamReader::QCborStreamReader(QIODevice *device)

Это перегруженный метод.

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

QCborStreamReader::QCborStreamReader(const QCborStreamReader &)

Создаёт экземпляр QCborStreamReader по умолчанию.

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 в противном случае. Значения 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, где число скопированных байтов в 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() равно 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().

QCborStreamReader &QCborStreamReader::operator=(const QCborStreamReader &)

Оператор присваивания по копированию.

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

Spec-Zone.ru

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