Класс QCborStreamWriter
Класс QCborStreamWriter — это простой кодировщик CBOR, работающий с односторонним потоком. Подробнее...
| Заголовок: | #include <QCborStreamWriter> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| С момента: | 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 | Да |
| Неопределённое | Да |
| Произвольные простые значения | Да |
| Половина плавающей запятой (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 не выполняет проверку на это.
В отличие от перегрузки append() для QLatin1String, этот метод не ограничен 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 попытается записать всю строку за один раз.
В отличие от перегрузки append() для QByteArray, этот метод не ограничен пределами размера 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 не выполняет проверку на это.
В отличие от перегрузки append() для QLatin1String, этот метод не ограничен 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 QList<QString> &values)
{
writer.startArray();
for (const QString &s : values)
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 QList<QPair<int, QString>> &values)
{
writer.startMap();
for (const auto pair : values) {
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-6.0/qcborstreamwriter.html