Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Conversion from QByteArray to int
Forum Updated to NodeBB v4.3 + New Features

Conversion from QByteArray to int

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 6 Posters 25.1k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    mulfycrowh
    wrote on last edited by
    #1

    Hi,

    I have a QByteArray and VS2015 during debugging phase gives:

    [size] 2
    [referenced] 1
    [0] 1 '\x1'
    [1] 0 '\0'

    I would like to convert this QByteArray to int.
    So I write:

    int count = info.toInt(&ok, 16);

    The result is count = 0 instead 1 and the conversion is false

    Could you help please

    miclandM 1 Reply Last reply
    0
    • M mulfycrowh

      Hi,

      I have a QByteArray and VS2015 during debugging phase gives:

      [size] 2
      [referenced] 1
      [0] 1 '\x1'
      [1] 0 '\0'

      I would like to convert this QByteArray to int.
      So I write:

      int count = info.toInt(&ok, 16);

      The result is count = 0 instead 1 and the conversion is false

      Could you help please

      miclandM Offline
      miclandM Offline
      micland
      wrote on last edited by micland
      #2

      @mulfycrowh
      toInt() expects that the QByteArray contains a string, but in your case, it's a list of bytes (the first bte contains the numerical value 1 and not the character "1").
      It's not clear how your array is structured but you can try something like that:

      int count = int(info[0]);
      for (int i=1; i<info.length(); ++i) {
         int b = int(info[i]);
         if (b > 0) {
            count = (count << 8) + b;
         } else {
            break;
         }
      }
      

      Update: thinking about your terminating \0: Are you sure you expect the value 1 and not 256?
      A null terminated array which does not represent a string does not makes sense so my code is an example but does not make sense, too....

      1 Reply Last reply
      1
      • Paul ColbyP Offline
        Paul ColbyP Offline
        Paul Colby
        wrote on last edited by Paul Colby
        #3

        As @micland said, QByteArray::toInt() expects an ASCII string.

        Its not clear why you have two bytes, but if:

        a) you only care about the first byte, then its a simple as:

        int count = info.at(0);
        

        b) if, for example, its a 16-bit integer packed into two bytes, then:

        #include <QtEndian>
        ...
        const int count = qFromLittleEndian<qint16>(info.data());
        

        Cheers.

        1 Reply Last reply
        2
        • M Offline
          M Offline
          mulfycrowh
          wrote on last edited by
          #4

          I tried something else that runs pretty well but in the wrong order:

          info.toHex().toInt(&ok, 16);
          

          The result is 256.
          It means that it has been read in the wrong order.
          How can I specify that first byte is LSB and second one MSB ?

          Paul ColbyP 1 Reply Last reply
          0
          • M mulfycrowh

            I tried something else that runs pretty well but in the wrong order:

            info.toHex().toInt(&ok, 16);
            

            The result is 256.
            It means that it has been read in the wrong order.
            How can I specify that first byte is LSB and second one MSB ?

            Paul ColbyP Offline
            Paul ColbyP Offline
            Paul Colby
            wrote on last edited by
            #5

            @mulfycrowh said in Conversion from QByteArray to int:

            info.toHex().toInt(&ok, 16);
            

            The intermediate conversion to hex is unnecessary.

            The result is 256. It means that it has been read in the wrong order.

            Whether that code will produce the right result or not, depends on the endianness of the host. In your case, as you said, its the wrong order. On another platform, it would be the correct order.

            How can I specify that first byte is LSB and second one MSB

            Exactly as I suggested above :)

            #include <QtEndian>
            ...
            const int count = qFromLittleEndian<qint16>(info.data());
            

            Here the qFromLittleEndian function knows how to convert from little-endian (least significant byte first), to whatever endianness your host is (which may or may not be the same endianness).

            Give it a go.

            Cheers.

            1 Reply Last reply
            1
            • M Offline
              M Offline
              mulfycrowh
              wrote on last edited by
              #6

              I tried what you suggested:

              qFromLittleEndian<quint16>(info.data());
              

              I've got the compiler error :

              C2665 'qFromLittleEndian': none of the 2 overloads could convert all the argument types

              Paul ColbyP 1 Reply Last reply
              0
              • M Offline
                M Offline
                mulfycrowh
                wrote on last edited by
                #7

                I mean qint16.
                Same issue

                1 Reply Last reply
                0
                • M mulfycrowh

                  I tried what you suggested:

                  qFromLittleEndian<quint16>(info.data());
                  

                  I've got the compiler error :

                  C2665 'qFromLittleEndian': none of the 2 overloads could convert all the argument types

                  Paul ColbyP Offline
                  Paul ColbyP Offline
                  Paul Colby
                  wrote on last edited by Paul Colby
                  #8

                  @mulfycrowh said in Conversion from QByteArray to int:

                  I've got the compiler error :
                  C2665 'qFromLittleEndian': none of the 2 overloads could convert all the argument types

                  Ah... from the qFromLittleEndian docs:

                  Note: Since Qt 5.7, the type of the src parameter is a void pointer.

                  For pre-5.7, you will need to cast to uchar, like:

                  int count = qFromLittleEndian<qint16>(reinterpret_cast<const uchar *>(info.data()));
                  

                  (I just tested that on Qt 5.5.1)

                  Cheers.

                  1 Reply Last reply
                  0
                  • M Offline
                    M Offline
                    mulfycrowh
                    wrote on last edited by
                    #9

                    thanks, it runs perfectly !

                    kshegunovK 1 Reply Last reply
                    0
                    • M mulfycrowh

                      thanks, it runs perfectly !

                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by kshegunov
                      #10

                      @mulfycrowh
                      A two byte sequence is a short, not int. You should use the data stream classes for such deserializations instead of going to type-safety hell:

                      QByteArray data; //< This is your data
                      
                      QDataStream in(data); //< Attach a read-only stream to it
                      in.setByteOrder(QDataStream::LittleEndian); //< Set the proper byte order
                      
                      qint16 result; //< The result you want
                      in >> result; //< Just read it from the stream
                      

                      Read and abide by the Qt Code of Conduct

                      S 1 Reply Last reply
                      4
                      • kshegunovK kshegunov

                        @mulfycrowh
                        A two byte sequence is a short, not int. You should use the data stream classes for such deserializations instead of going to type-safety hell:

                        QByteArray data; //< This is your data
                        
                        QDataStream in(data); //< Attach a read-only stream to it
                        in.setByteOrder(QDataStream::LittleEndian); //< Set the proper byte order
                        
                        qint16 result; //< The result you want
                        in >> result; //< Just read it from the stream
                        
                        S Offline
                        S Offline
                        sude
                        wrote on last edited by
                        #11

                        @kshegunov said in Conversion from QByteArray to int:

                        QByteArray data; //< This is your data

                        QDataStream in(data); //< Attach a read-only stream to it
                        in.setByteOrder(QDataStream::LittleEndian); //< Set the proper byte order

                        qint16 result; //< The result you want
                        in >> result; //< Just read it from the stream

                        Hi i want to read more than one number and i can read only first number how can i read all of them plese help me :) !!

                        JonBJ 1 Reply Last reply
                        0
                        • S sude

                          @kshegunov said in Conversion from QByteArray to int:

                          QByteArray data; //< This is your data

                          QDataStream in(data); //< Attach a read-only stream to it
                          in.setByteOrder(QDataStream::LittleEndian); //< Set the proper byte order

                          qint16 result; //< The result you want
                          in >> result; //< Just read it from the stream

                          Hi i want to read more than one number and i can read only first number how can i read all of them plese help me :) !!

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by
                          #12

                          @sude
                          Execute a further in >> something operation to read more data. What else is there to say?

                          1 Reply Last reply
                          1
                          • S Offline
                            S Offline
                            sude
                            wrote on last edited by
                            #13

                            It isnt work, i still read first number of array :(

                            JonBJ 1 Reply Last reply
                            0
                            • S sude

                              It isnt work, i still read first number of array :(

                              JonBJ Offline
                              JonBJ Offline
                              JonB
                              wrote on last edited by
                              #14

                              @sude
                              It does work. So your code is wrong, or your data is not what you expect, or you are not looking at the right thing. Suggest you open your own new topic for this and post your problem/code; this topic is very old.

                              S 1 Reply Last reply
                              1
                              • JonBJ JonB

                                @sude
                                It does work. So your code is wrong, or your data is not what you expect, or you are not looking at the right thing. Suggest you open your own new topic for this and post your problem/code; this topic is very old.

                                S Offline
                                S Offline
                                sude
                                wrote on last edited by
                                #15

                                @JonB OK, thanks a lot. I'm appriciate your answer. I will create new topic. :)

                                1 Reply Last reply
                                0

                                • Login

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved