Search code examples
qtqt5qbytearrayqdatastreamqudpsocket

Convert Union to QByteArray and vice-versa using QUdpSocket in Qt


I have one Union like below

#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];
};

I want to convert myData union into a QByteArray so that I can send it through socket using QUdpSocket using writeDatagram() function. So first tell me how can I convert this into QByteArray.

Next thing is that, On the receiver side how can I convert the QByteArray into the this Union myData again.


Solution

  • Use QByteArray constructor or QByteArray::fromRawData.

    See example for converting to 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();
    }
    

    Convert from 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
    

    Actually, you can call writeDatagram directly:

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