QByteArray qint32 and little endianness



  • Hello,

    I'm re-writing a small C program in QT. I have not used QT before and have very limited experience in C++. My program connects to a small device over serial and retrieves some values from it. I'm having a bit of a difficult time trying to build my binary packet, and wondered if there is a better or proper way doing it with QT and the included types. The packet consists of a byte or two bytes, and the format is in little endian. The data length is 4 bytes. But split into two 2Bytes. Below is an example of the packet.

    The packet consists of the following [Command - Byte] [Subcommand - Byte] [DataLength1 - 2Bytes] [Datalength2 - 2Bytes] [Data - nBytes]

    I'm using QByteArray for the packet and defined Command as an qint8, Subcommand as qint16, and Datalength as qint32. I then use QDataStream to assign the data as follows:

        QDataStream data(&_packet, QIODevice::WriteOnly);
        data << _command;
        data << _param1;
        data << _dataSize;
    

    This gives me the "correct" data with the correct final length and all that. The problem now is that I need to split dataSize into two Words, and assign them in little endian format. So the data ;

    CMD     PARAM   Length      DATA
    0x65    0x02    0xAABBCCDD  0X00
    

    Should be as below:

    CMD     PARAM   Len1    len2        DATA
    0x65    0x02    0xBBAA  0xDDCC      0X00
    

    The way I have been doing it in my small C program is using a typedef like below:

    typedef union _WORD_VAL {
    	WORD Word;BYTE Bytes[2];
    } WORD_VAL;
    /////////
    WORD_VAL wParam;
    wParam = 10;
    byte[0] = wParam.Bytes[0];
    byte[1] = wParam.Bytes[1];
    

    So my question is; what is the best way to do this in QT or C++. Or is it easier to just define my own type like I did before.

    Any help would be greatly appreciated.



  • Hi, you can try setting the byte order directly in your QDataStream, like this:

    QDataStream data(&_packet, QIODevice::WriteOnly);
    data.setByteOrder(QDataStream::LittleEndian);    
    data << _command;
    data << _param1;
    data << _dataSize;
    


  • Hi Hskoglund,

    Thank you very much for the reply and the solution. This is working perfectly!

    Much appreciated!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.