Преобразование Union в QByteArray и наоборот с помощью QUdpSocket в Qt

У меня есть один союз, как показано ниже

#define no_of_bits 240
#define word_size 16

struct bits
{
    unsigned short int bit1:1;
    unsigned short int bit2:1;
    unsigned short int bit3:1;
    unsigned short int bit4:1;
    unsigned short int bit5:1;
    unsigned short int bit6:1;
    unsigned short int bit7:1;
    unsigned short int bit8:1;
    unsigned short int bit9:1;
    unsigned short int bit10:1;
    unsigned short int bit11:1;
    unsigned short int bit12:1;
    unsigned short int bit13:1;
    unsigned short int bit14:1;
    unsigned short int bit15:1;
    unsigned short int bit16:1;
};

union myData
{
        unsigned short int data[no_of_bits/word_size];
        struct bits word[no_of_bits/word_size];
};

Я хочу преобразовать myData union в QByteArray, чтобы я мог отправить его через сокет, используя QUdpSocket, используя функцию writeDatagram(). Итак, сначала скажите мне, как я могу преобразовать это в QByteArray.

Следующее, что на стороне получателя, как я могу снова преобразовать QByteArray в этот союз myData.


person Vinay Kumar    schedule 30.07.2020    source источник
comment
Трудно сказать без дополнительного кода/контекста, но... похоже, вы пытаетесь ввести каламбур через союз. Насколько мне известно, это неопределенное поведение.   -  person G.M.    schedule 30.07.2020
comment
какой код вам нужен здесь? Я просто хочу преобразовать этот союз myData в QByteArray, чтобы я мог отправить его по сети, а на принимающей стороне, как я могу преобразовать этот QByteArray в союз. Надеюсь, ты понял, что я хотел.   -  person Vinay Kumar    schedule 30.07.2020


Ответы (1)


Используйте конструктор QByteArray или QByteArray::fromRawData.

См. пример преобразования в QByteArray:

#include <QCoreApplication>
#include <QByteArray>


#define no_of_bits 240
#define word_size 16

struct bits
{
    unsigned short int bit1:1;
    unsigned short int bit2:1;
    unsigned short int bit3:1;
    unsigned short int bit4:1;
    unsigned short int bit5:1;
    unsigned short int bit6:1;
    unsigned short int bit7:1;
    unsigned short int bit8:1;
    unsigned short int bit9:1;
    unsigned short int bit10:1;
    unsigned short int bit11:1;
    unsigned short int bit12:1;
    unsigned short int bit13:1;
    unsigned short int bit14:1;
    unsigned short int bit15:1;
    unsigned short int bit16:1;
};

union myData
{
        unsigned short int data[no_of_bits/word_size];
        struct bits word[no_of_bits/word_size];
};



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    myData data;

    // Variant 1  (no copy data)
    auto byteArray = QByteArray::fromRawData(reinterpret_cast<const char*>(&data), sizeof(data));

    // Variant 2  (copy data)
    QByteArray byteArray2(reinterpret_cast<const char*>(&data), sizeof(data));

    return a.exec();
}

Преобразование из QByteArray:

assert(byteArray.size() == sizeof(data));
memcpy(&data, byteArray.data(), sizeof(data)); // Copy

// OR

assert(byteArray.size() == sizeof(data));
myData* data2 = reinterpret_cast<myData*>(byteArray.data()); // No copy

На самом деле, вы можете вызвать writeDatagram напрямую:

QUdpSocket socket;
socket.writeDatagram(reinterpret_cast<const char*>(&data), sizeof(data), QHostAddress("127.0.0.1"), 1234);
person Ihor Drachuk    schedule 30.07.2020