Spec-Zone.ru › Qt 5.13

Класс QCborStreamWriter

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

Заголовок: #include <QCborStreamWriter>
qmake: QT += core
С тех пор: Qt 5.12

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

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

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

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

QCborStreamWriter(QByteArray *data)
QCborStreamWriter(QIODevice *device)
~QCborStreamWriter()
void append(quint64 u)
void append(qint64 i)
void append(QCborNegativeInteger n)
void append(const QByteArray &ba)
void append(QLatin1String str)
void append(QStringView str)
void append(QCborTag tag)
void append(QCborKnownTags tag)
void append(QCborSimpleType st)
void append(std::nullptr_t)
void append(qfloat16 f)
void append(float f)
void append(double d)
void append(bool b)
void append(const char *str, qsizetype size = -1)
void appendByteString(const char *data, qsizetype len)
void appendNull()
void appendTextString(const char *utf8, qsizetype len)
void appendUndefined()
QIODevice * device() const
bool endArray()
bool endMap()
void setDevice(QIODevice *device)
void startArray()
void startArray(quint64 count)
void startMap()
void startMap(quint64 count)

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

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

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

Типичное использование QCborStreamWriter заключается в создании объекта на целевом QByteArray или QIODevice, а затем вызове одного из перегрузок append() с требуемым типом для кодирования. Для создания массивов и словарей QCborStreamWriter предоставляет перегрузки startArray() и startMap(), которые должны быть завершены соответствующими функциями endArray() и endMap().

Следующий пример кодирует эквивалент следующего содержимого JSON:

{ "label": "journald", "autoDetect": false, "condition": "libs.journald", "output": [ "privateFeature" ] }

   writer.startMap(4);    // 4 elements in the map

   writer.append(QLatin1String("label"));
   writer.append(QLatin1String("journald"));

   writer.append(QLatin1String("autoDetect"));
   writer.append(false);

   writer.append(QLatin1String("condition"));
   writer.append(QLatin1String("libs.journald"));

   writer.append(QLatin1String("output"));
   writer.startArray(1);
   writer.append(QLatin1String("privateFeature"));
   writer.endArray();

   writer.endMap();

Поддержка CBOR

QCborStreamWriter поддерживает все функции CBOR, необходимые для создания канонических и строгих потоков. Он реализует почти все функции, указанные в RFC 7049.

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

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

Каноническое кодирование CBOR

Каноническое кодирование CBOR определено в Разделе 3.9 RFC 7049. Каноническое кодирование не является требованием для функциональности декодирования CBOR в Qt, но оно может потребоваться для некоторых протоколов. В частности, протоколы, требующие возможности идентичного воспроизведения потока, могут потребовать этого.

Для того, чтобы считаться "каноническим", поток CBOR должен удовлетворять следующим требованиям:

  • Целые числа должны быть как можно меньше. QCborStreamWriter всегда делает это (нет необходимости в действиях пользователя, и невозможно записать слишком длинные целые числа).
  • Длины массивов, словарей и строк должны быть как можно короче. Как и выше, QCborStreamWriter автоматически делает это.
  • Массивы, словари и строки должны использовать явную длину. QCborStreamWriter всегда делает это для строк; для массивов и словарей обязательно вызывайте перегрузки startArray() и startMap() с явной длиной.
  • Ключи в каждом словаре должны быть отсортированы по возрастанию. QCborStreamWriter не оказывает помощи в этом: разработчик должен убедиться, что перед вызовом append() для пар словаря сортировка выполняется.
  • Значения с плавающей точкой должны быть как можно меньше. QCborStreamWriter не будет преобразовывать значения с плавающей точкой; разработчик должен выполнить эту проверку перед вызовом append() (см. примеры этих функций).

Жесткий режим CBOR

Жесткий режим определяется разделом 3.10 RFC 7049. Как и в случае с каноническим кодированием выше, QCborStreamWriter позволяет создавать потоки CBOR в жестком режиме, но не требует их и не проверяет, что выходной поток является таковым.

  • Ключи в словаре должны быть уникальными. QCborStreamWriter не выполняет проверку ключей словаря.
  • Теги могут быть обязаны быть сопоставлены только с соответствующими типами в соответствии со своим описанием. QCborStreamWriter не выполняет проверки использования тегов.
  • Текстовые строки должны быть правильно закодированы в UTF-8. QCborStreamWriter всегда записывает правильные UTF-8 для строк, добавленных с помощью append(), но не выполняет проверки для строк, добавленных с помощью appendTextString().

Неверный поток CBOR

Также возможно неправильное использование QCborStreamWriter и получение неверных потоков CBOR, которые не будут декодированы получателем. Следующие действия приведут к созданию неверных потоков:

  • Добавление тега без последующего добавления соответствующего значения с тегом (QCborStreamWriter не выдает диагностики).
  • Добавление слишком большого или слишком малого числа элементов в массив или словарь с явной длиной (endMap() и endArray() вернут false, и QCborStreamWriter будет регистрировать предупреждение с помощью qWarning()).

См. также QCborStreamReader, QCborValue и QXmlStreamWriter.

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

QCborStreamWriter::QCborStreamWriter(QByteArray *data)

Создает объект QCborStreamWriter, который будет добавлять поток в data. Все потоковые операции выполняются немедленно в массив байтов, без необходимости сброса буферов.

Следующий пример записывает число в массив байтов и возвращает его.

   QByteArray encodedNumber(qint64 value)
   {
       QByteArray ba;
       QCborStreamWriter writer(&ba);
       writer.append(value);
       return ba;
   }

QCborStreamWriter не берет на себя ответственность за data.

QCborStreamWriter::QCborStreamWriter(QIODevice *device)

Создает объект QCborStreamWriter, который будет записывать поток в device. Устройство должно быть открыто до первого вызова append(). Этот конструктор можно использовать с любым классом, производным от QIODevice, например, QFile, QProcess или QTcpSocket.

QCborStreamWriter не имеет буферизации, поэтому каждый вызов append() приведет к одному или нескольким вызовам метода write() устройства.

Следующий пример записывает пустой словарь в файл:

   QFile f("output", QIODevice::WriteOnly);
   QCborStreamWriter writer(&f);
   writer.startMap(0);
   writer.endMap();

QCborStreamWriter не берет на себя ответственность за device.

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

QCborStreamWriter::~QCborStreamWriter()

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

QCborStreamWriter не выполняет проверки ошибок, чтобы убедиться, что все необходимые элементы были записаны в поток до уничтожения объекта. Это обязанность программиста.

void QCborStreamWriter::append(quint64 u)

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

Добавляет 64-битное беззнаковое значение u в поток CBOR, создавая значение CBOR Беззнакового целого. В следующем примере мы записываем значения 0, 232 и UINT64_MAX:

   writer.append(0U);
   writer.append(Q_UINT64_C(4294967296));
   writer.append(std::numeric_limits<quint64>::max());

См. также QCborStreamReader::isUnsignedInteger() и QCborStreamReader::toUnsignedInteger().

void QCborStreamWriter::append(qint64 i)

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

Добавляет 64-битное знаковое значение i в поток CBOR. Это создаст значение CBOR Беззнакового целого или CBOR Отрицательного целого в зависимости от знака параметра. В следующем примере мы записываем значения 0, -1, 232 и INT64_MAX:

   writer.append(0);
   writer.append(-1);
   writer.append(Q_INT64_C(4294967296));
   writer.append(std::numeric_limits<qint64>::max());

См. также QCborStreamReader::isInteger() и QCborStreamReader::toInteger().

void QCborStreamWriter::append(QCborNegativeInteger n)

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

Добавляет 64-битное отрицательное значение n в поток CBOR. QCborNegativeInteger — это 64-битный перечисление, содержащий абсолютное значение отрицательного числа, которое мы хотим записать. Если n равно нулю, записанное значение будет эквивалентно 264 (то есть -18,446,744,073,709,551,616).

В следующем примере мы записываем значения -1, -232 и INT64_MIN:

   writer.append(QCborNegativeInteger(1));
   writer.append(QCborNegativeInteger(Q_INT64_C(4294967296)));
   writer.append(QCborNegativeInteger(-quint64(std::numeric_limits<qint64>::min())));

Обратите внимание, как эта функция может использоваться для кодирования чисел, которые не могут поместиться в стандартный 64-битный знаковый целочисленный тип данных, такой как qint64. То есть, если n больше, чем std::numeric_limits<qint64>::max() или равно 0, это будет представлять отрицательное число, меньшее чем std::numeric_limits<qint64>::min().

См. также QCborStreamReader::isNegativeInteger() и QCborStreamReader::toNegativeInteger().

void QCborStreamWriter::append(const QByteArray &ba)

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

Добавляет массив байтов ba в поток, создавая значение CBOR Массива байтов. QCborStreamWriter попытается записать всю строку за один раз.

Следующий пример загрузит и добавит содержимое файла в поток:

   void writeFile(QCborStreamWriter &writer, const QString &fileName)
   {
       QFile f(fileName);
       if (f.open(QIODevice::ReadOnly))
           writer.append(f.readAll());
   }

Как показывает пример, в отличие от JSON, CBOR не требует экранирования для двоичного содержимого.

См. также appendByteString(), QCborStreamReader::isByteArray() и QCborStreamReader::readByteArray().

void QCborStreamWriter::append(QLatin1String str)

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

Добавляет текстовую строку str в поток, создавая значение CBOR Текстовой строки. QCborStreamWriter попытается записать всю строку за один раз.

Следующий пример добавляет простую строку в поток:

   writer.append(QLatin1String("Hello, World"));

Примечание по производительности: CBOR требует, чтобы все текстовые строки были закодированы в UTF-8, поэтому эта функция будет перебирать символы в строке, чтобы определить, является ли содержимое US-ASCII или нет. Если в строке обнаружены символы, не входящие в US-ASCII, она выделит память и преобразует ее в UTF-8. Если эта проверка не нужна, используйте appendTextString() вместо этого.

См. также QCborStreamReader::isString() и QCborStreamReader::readString().

void QCborStreamWriter::append(QStringView str)

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

Добавляет текстовую строку str в поток, создавая значение CBOR Текстовой строки. QCborStreamWriter попытается записать всю строку за один раз.

Следующий пример записывает произвольную строку QString в поток:

   void writeString(QCborStreamWriter &writer, const QString &str)
   {
       writer.append(str);
   }

См. также QCborStreamReader::isString() и QCborStreamReader::readString().

void QCborStreamWriter::append(QCborTag tag)

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

Добавляет тег CBOR tag в поток, создавая значение CBOR Тега. Все теги должны быть последовать другим типом, для которого они предоставляют смысл.

В следующем примере мы добавляем тег CBOR 36 (Регулярное выражение) и шаблон QRegularExpression в поток:

   void writeRxPattern(QCborStreamWriter &writer, const QRegularExpression &rx)
   {
       writer.append(QCborTag(36));
       writer.append(rx.pattern());
   }

См. также QCborStreamReader::isTag() и QCborStreamReader::toTag().

void QCborStreamWriter::append(QCborKnownTags tag)

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

Добавляет тег CBOR tag в поток, создавая значение CBOR Тега. Все теги должны быть последовать другим типом, для которого они предоставляют смысл.

В следующем примере мы добавляем CBOR тег 1 (Unix time_t) и целое число, представляющее текущее время, в поток, полученное с помощью функции time():

   void writeCurrentTime(QCborStreamWriter &writer)
   {
       writer.append(QCborKnownTags::UnixTime_t);
       writer.append(time(nullptr));
   }

См. также QCborStreamReader::isTag() и QCborStreamReader::toTag().

void QCborStreamWriter::append(QCborSimpleType st)

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

Добавляет CBOR простой тип st в поток, создавая значение CBOR Простого типа. В следующем примере мы записываем простой тип для Null, а также для типа 32, для которого Qt не поддерживает.

  writer.append(QCborSimpleType::Null);
  writer.append(QCborSimpleType(32));

Примечание: Использование простых типов, для которых нет спецификации, может привести к ошибкам проверки удалённым получателем. Кроме того, значения простых типов с 24 по 31 (включительно) зарезервированы и не должны использоваться.

См. также QCborStreamReader::isSimpleType() и QCborStreamReader::toSimpleType().

void QCborStreamWriter::append(std::nullptr_t)

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

Добавляет значение CBOR Null в поток. Эта функция эквивалентна (и реализована как): параметр игнорируется.

   writer.append(QCborSimpleType::Null);

См. также appendNull(), append(QCborSimpleType), и QCborStreamReader::isNull().

void QCborStreamWriter::append(qfloat16 f)

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

Добавляет число с плавающей запятой f в поток, создавая значение CBOR 16-битного числа с плавающей запятой половинной точности. Следующий код может быть использован для преобразования C++ float в qfloat16, если нет потери точности, и добавить его, или вместо этого добавить float.

   void writeFloat(QCborStreamWriter &writer, float f)
   {
       qfloat16 f16 = f;
       if (qIsNaN(f) || f16 == f)
           writer.append(f16);
       else
           writer.append(f);
   }

См. также QCborStreamReader::isFloat16() и QCborStreamReader::toFloat16().

void QCborStreamWriter::append(float f)

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

Добавляет число с плавающей запятой f в поток, создавая значение CBOR 32-битного числа с плавающей запятой одинарной точности. Следующий код может быть использован для преобразования C++ double в float, если нет потери точности, и добавить его, или вместо этого добавить double.

   void writeFloat(QCborStreamWriter &writer, double d)
   {
       float f = d;
       if (qIsNaN(d) || d == f)
           writer.append(f);
       else
           writer.append(d);
   }

См. также QCborStreamReader::isFloat() и QCborStreamReader::toFloat().

void QCborStreamWriter::append(double d)

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

Добавляет число с плавающей запятой d в поток, создавая значение CBOR 64-битного числа с плавающей запятой двойной точности. QCborStreamWriter всегда добавляет число как есть, не выполняя проверку на то, является ли число канонической формой NaN, бесконечности, является ли оно поднормализованным или может быть записано в более коротком формате.

Следующий код выполняет все эти проверки, за исключением поднормализованного, который, как ожидается, будет учтён системой FPU или эмуляцией чисел с плавающей запятой напрямую.

   void writeDouble(QCborStreamWriter &writer, double d)
   {
       float f;
       if (qIsNaN(d)) {
           writer.append(qfloat16(qQNaN()));
       } else if (qIsInf(d)) {
           writer.append(d < 0 ? -qInf() : qInf());
       } else if ((f = d) == d) {
           qfloat16 f16 = f;
           if (f16 == f)
               writer.append(f16);
           else
               writer.append(f);
       } else {
           writer.append(d);
       }
   }

Определение того, может ли double быть преобразован в целое число без потери точности, оставлено читателю в качестве упражнения.

См. также QCborStreamReader::isDouble() и QCborStreamReader::toDouble().

void QCborStreamWriter::append(bool b)

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

Добавляет логическое значение b в поток, создавая либо значение CBOR False, либо CBOR True. Эта функция эквивалентна (и реализована как):

   writer.append(b ? QCborSimpleType::True : QCborSimpleType::False);

См. также appendNull(), appendUndefined(), QCborStreamReader::isBool(), и QCborStreamReader::toBool().

void QCborStreamWriter::append(const char *str, qsizetype size = -1)

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

Добавляет size байтов текста, начиная с str, в поток, создавая значение CBOR текстовой строки. QCborStreamWriter попытается записать всю строку в одном блоке. Если size равно -1, эта функция запишет strlen(\a str) байтов.

Ожидается, что строка, на которую указывает str, будет правильно закодирована в UTF-8. QCborStreamWriter не выполняет проверку на это.

В отличие от перегрузки QLatin1String функции append(), эта функция не ограничена 2 ГБ. Однако обратите внимание, что ни QCborStreamReader, ни QCborValue не поддерживают чтение CBOR потоков с текстовыми строками больше 2 ГБ.

См. также append(QLatin1String), append(QStringView), QCborStreamReader::isString(), и QCborStreamReader::readString().

void QCborStreamWriter::appendByteString(const char *data, qsizetype len)

Добавляет len байтов данных, начиная с data, в поток, создавая значение CBOR байтовой строки. QCborStreamWriter попытается записать всю строку в одном блоке.

В отличие от перегрузки QByteArray функции append(), эта функция не ограничена размерами QByteArray. Однако обратите внимание, что ни QCborStreamReader::readByteArray(), ни QCborValue не поддерживают чтение CBOR потоков с массивами байтов больше 2 ГБ.

См. также append(), appendTextString(), QCborStreamReader::isByteArray(), и QCborStreamReader::readByteArray().

void QCborStreamWriter::appendNull()

Добавляет значение CBOR Null в поток. Эта функция эквивалентна (и реализована как):

   writer.append(QCborSimpleType::Null);

См. также append(std::nullptr_t), append(QCborSimpleType), и QCborStreamReader::isNull().

void QCborStreamWriter::appendTextString(const char *utf8, qsizetype len)

Добавляет len байтов текста, начиная с utf8, в поток, создавая значение CBOR текстовой строки. QCborStreamWriter попытается записать всю строку в одном блоке.

Ожидается, что строка, на которую указывает utf8, будет правильно закодирована в UTF-8. QCborStreamWriter не выполняет проверку на это.

В отличие от перегрузки QLatin1String функции append(), эта функция не ограничена 2 ГБ. Однако обратите внимание, что ни QCborStreamReader::readString(), ни QCborValue не поддерживают чтение CBOR потоков с текстовыми строками больше 2 ГБ.

См. также append(QLatin1String), append(QStringView), QCborStreamReader::isString(), и QCborStreamReader::readString().

void QCborStreamWriter::appendUndefined()

Добавляет значение CBOR Undefined в поток. Эта функция эквивалентна (и реализована как):

   writer.append(QCborSimpleType::Undefined);

См. также append(QCborSimpleType) и QCborStreamReader::isUndefined().

QIODevice *QCborStreamWriter::device() const

Возвращает QIODevice, в который записывает этот объект QCborStreamWriter. Устройство должно быть ранее установлено с помощью конструктора или setDevice().

Если этот объект был создан путём записи в QByteArray, эта функция вернёт внутренний экземпляр QBuffer, который принадлежит QCborStreamWriter.

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

bool QCborStreamWriter::endArray()

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

Возвращение false указывает на ошибку в приложении и невосстановимую ошибку в этом потоке. QCborStreamWriter также выводит предупреждение с помощью qWarning(), если это произойдёт.

Вызов этой функции, когда текущий контейнер не является массивом, также является ошибкой, хотя QCborStreamWriter в настоящее время не может обнаружить это условие.

См. также startArray(), startArray(quint64), и endMap().

bool QCborStreamWriter::endMap()

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

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

Вызов этой функции, когда текущий контейнер не является словарем, также является ошибкой, хотя QCborStreamWriter в настоящее время не может обнаружить это условие.

См. также startMap(), startMap(quint64) и endArray().

void QCborStreamWriter::setDevice(QIODevice *device)

Заменяет устройство или массив байтов, в который записывает этот объект QCborStreamWriter, на device.

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

void QCborStreamWriter::startArray()

Начинает массив CBOR неопределенной длины в потоке CBOR. Каждый вызов startArray() должен быть связан с одним вызовом endArray(), и текущий элемент CBOR простирается до конца массива.

Массив, созданный этой функцией, не имеет явной длины. Вместо этого его длина подразумевается элементами, содержащимися в нём. Однако следует отметить, что использование массивов неопределенной длины не соответствует каноническому кодированию CBOR.

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

   void appendList(QCborStreamWriter &writer, const QLinkedList<QString> &list)
   {
       writer.startArray();
       for (const QString &s : list)
           writer.append(s);
       writer.endArray();
   }

См. также startArray(quint64), endArray(), startMap(), QCborStreamReader::isArray() и QCborStreamReader::isLengthKnown().

void QCborStreamWriter::startArray(quint64 count)

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

Начинает массив CBOR с явной длиной count элементов в потоке CBOR. Каждый вызов startArray должен быть связан с одним вызовом endArray(), и текущий элемент CBOR простирается до конца массива.

Созданный этой функцией массив имеет явную длину, и поэтому в поток CBOR необходимо добавить ровно count элементов. Добавление меньшего или большего количества элементов приведёт к ошибке во время вызова endArray(), и поток CBOR будет повреждён. Однако массивы с явной длиной необходимы для канонического кодирования CBOR.

Следующий пример добавляет все строки, найденные в QStringList, переданной в качестве входных данных:

   void appendList(QCborStreamWriter &writer, const QStringList &list)
   {
       writer.startArray(list.size());
       for (const QString &s : list)
           writer.append(s);
       writer.endArray();
   }

Ограничения по размеру: Параметр этой функции — quint64, что, по-видимому, позволяет использовать до 264-1 элементов в массиве. Однако как QCborStreamWriter, так и QCborStreamReader в настоящее время ограничены 232-2 элементами на 32-битных системах и 264-2 элементами на 64-битных. Также обратите внимание, что QCborArray в настоящее время ограничен 227 элементами на любой платформе.

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

void QCborStreamWriter::startMap()

Начинает словарь CBOR неопределенной длины в потоке CBOR. Каждый вызов startMap() должен быть связан с одним вызовом endMap(), и текущий элемент CBOR простирается до конца словаря.

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

Следующий пример добавляет элементы из связанного списка пар «целое число — строка», переданных в качестве входных данных:

   void appendMap(QCborStreamWriter &writer, const QLinkedList<QPair<int, QString>> &list)
   {
       writer.startMap();
       for (const auto pair : list) {
           writer.append(pair.first)
           writer.append(pair.second);
       }
       writer.endMap();
   }

См. также startMap(quint64), endMap(), startArray(), QCborStreamReader::isMap() и QCborStreamReader::isLengthKnown().

void QCborStreamWriter::startMap(quint64 count)

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

Начинает словарь CBOR с явной длиной count элементов в потоке CBOR. Каждый вызов startMap должен быть связан с одним вызовом endMap(), и текущий элемент CBOR простирается до конца словаря.

Созданный этой функцией словарь имеет явную длину, и поэтому в поток CBOR необходимо добавить ровно count пар элементов. Добавление меньшего или большего количества элементов приведёт к ошибке во время вызова endMap(), и поток CBOR будет повреждён. Однако словари с явной длиной необходимы для канонического кодирования CBOR.

Следующий пример добавляет все строки, найденные в QMap, переданной в качестве входных данных:

   void appendMap(QCborStreamWriter &writer, const QMap<int, QString> &map)
   {
       writer.startMap(map.size());
       for (auto it = map.begin(); it != map.end(); ++it) {
           writer.append(it.key());
           writer.append(it.value());
       }
       writer.endMap();
   }

Ограничения по размеру: Параметр этой функции — quint64, что, по-видимому, позволяет использовать до 264-1 пар в словаре. Однако как QCborStreamWriter, так и QCborStreamReader в настоящее время ограничены 231-1 элементами на 32-битных системах и 263-1 элементами на 64-битных. Также обратите внимание, что QCborMap в настоящее время ограничен 226 элементами на любой платформе.

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

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

Spec-Zone.ru

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