Spec-Zone.ru › Qt 5.12

Класс QCborStreamWriter

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

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

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

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

QCborStreamWriter(QIODevice *device)
QCborStreamWriter(QByteArray *data)
QCborStreamWriter(const QCborStreamWriter &)
~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)
QCborStreamWriter & operator=(const QCborStreamWriter &)

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

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

Этот класс можно использовать для быстрого кодирования потока 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(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(QByteArray *data)

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

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

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

QCborStreamWriter не получает владения data.

QCborStreamWriter::QCborStreamWriter(const QCborStreamWriter &)

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

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-битного числа с плавающей запятой половинной точности. Следующий код можно использовать для преобразования float C++ в 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-битного числа с плавающей запятой одинарной точности. Следующий код можно использовать для преобразования double C++ в 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);
       }
   }

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

См. также 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().

QCborStreamWriter &QCborStreamWriter::operator=(const QCborStreamWriter &)

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

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

Spec-Zone.ru

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