Класс 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 { КонецСтроки, Хорошо, Ошибка } |
| Перечисление | 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() для продвижения. |
| Строки | Массивы байтов, текстовые строки | Длина (если известна) предварительно распарсивается, но сама строка — нет. Функции-акцессоры не являются const и могут выделять память. После вызова функции-акцессоры автоматически переходят к следующему элементу. |
| Контейнеры | Массивы, карты | Длина (если известна) предварительно распарсивается. Для доступа к элементам необходимо вызвать 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.
Документация по типам членов
перечисление 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) Текст Юникода, возможно содержащий 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)
Добавляет данные в поток CBOR и повторно анализирует текущий элемент. Эта функция полезна, если конец данных был достигнут ранее при обработке потока, но теперь доступно больше данных.
void QCborStreamReader::addData(const char *данные, qsizetype len)
Это перегруженная функция.
Добавляет len байтов данных, начиная с данных, в поток CBOR и повторно анализирует текущий элемент. Эта функция полезна, если конец данных был достигнут ранее при обработке потока, но теперь доступно больше данных.
void QCborStreamReader::addData(const quint8 *данные, qsizetype len)
Это перегруженная функция.
Добавляет len байтов данных, начиная с данных, в поток 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(). Null — это нормальный тип CBOR, который должен обрабатываться приложением.
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() для чтения этих данных.
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, в члене 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-6.2/qcborstreamreader.html