Как я могу получить необработанный двоичный контент из QVariant произвольного типа в QBytearray?

Проблема

У меня есть интерфейс, который дает мне QVariant произвольного типа. Мне нужно преобразовать содержимое данных в этом варианте в необработанный двоичный файл QByteArray:

QVariant result = myQVariantReturningMethod(type arg, type arg2);
QByteArray rawResult = ?;

Задний план

Полученный QByteArray отправляется по Canbus. В зависимости от размера передается в нескольких баночных рамах или в одной. Интерфейс шины CAN для отправки кадров принимает QByteArray в качестве входных данных. Основываясь на дополнительной информации, получатель кадров банок знает, как анализировать входящий поток кадров банок.

Что я пробовал до сих пор

Я пробовал несколько подходов

  • Использование QDataStream для получения данных в массиве. Однако сериализация работает непредсказуемым образом, когда я всегда получаю дополнительную информацию о самом типе в результирующем массиве, в зависимости от реализации операторов <</>> для типа.
  • Использование toString().toStdString() из QVariant приводит к приведенному значению, а не к фактическим необработанным двоичным данным, чего я не хочу.
  • Использование toBytearryay() приводит к тому же.

Меня не волнует, является ли возможным подходом к проблеме путь stl или путь qt. Однако он должен быть c++11-совместимым.


person darkmattercoder    schedule 20.01.2021    source источник
comment
В представленном виде это выглядит как xy-проблема. Можете ли вы предоставить некоторые подробности о том, как вы планируете использовать полученный QByteArray?   -  person G.M.    schedule 20.01.2021
comment
Уточнил первоначальный вопрос.   -  person darkmattercoder    schedule 20.01.2021
comment
Вы все еще что-то упускаете в моей разработке?   -  person darkmattercoder    schedule 21.01.2021
comment
Я не вижу способа напрямую поместить QVariant в QByteArray. Лично я бы использовал метод QDataStream, который вы уже пробовали: кодировать в QByteArray с помощью QDataStream на отправителе и декодировать из QByteArray через QDataStream на получателе.   -  person G.M.    schedule 21.01.2021
comment
Это потребует, чтобы получатель знал о qt, чего он не знает. Кроме того, это значительно увеличило бы нагрузку на шину CAN из-за накладных расходов. Даже если я укажу получателю, как правильно анализировать байты, хранящиеся в qdatastream на стороне отправителя, я не окажу влияния на реализацию получателя. Тем не менее спасибо за ваши усилия.   -  person darkmattercoder    schedule 22.01.2021
comment
В этом случае я думаю, что единственный вариант - декодировать QVariant, возвращенный myQVariantReturningMethod на стороне отправителя, и записать его в QByteArray на основе фактического типа, содержащегося в нем.   -  person G.M.    schedule 22.01.2021


Ответы (1)


Оказывается, у QVariant есть недокументированный метод constData(), который дает именно тот результат, который я хочу получить: указатель на внутренне сохраненные данные QVariant. Вместе с QMetaType::sizeOf() это как раз то, что нужно для записи всех данных в QByteArray.

Я обнаружил, что этот метод задокументирован в документации Qt 6.0, и обнаружил, что он также работает с моим Qt 5.12.7, несмотря на то, что он не описан в соответствующей документации.

person darkmattercoder    schedule 25.01.2021