Класс 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 | Да |
| Неопределено | Да |
| Произвольные простые значения | Да |
| Числа с плавающей точкой полуточной точности (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) Текстовые данные 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(). 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 со значением количества скопированных байтов в 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.0/qcborstreamreader.html