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 of byte to binary
QtWS25 Last Chance

Conversion of byte to binary

Scheduled Pinned Locked Moved Solved General and Desktop
2 Posts 1 Posters 4.1k Views
  • 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.
  • Q Offline
    Q Offline
    Qcontinuum
    wrote on last edited by Qcontinuum
    #1

    I am having difficulty with conversion of a byte held in a QByteArray to a binary value ussing QString::Number. I have a piece of code that copied 5 bytes from the serial device into a QByteArray. I then need to loop through the 5 bytes and process the individual bits in each byte. For debugging purposes I have a set up a TextBrowser object in the GUI and am displaying the byte data using 'ui->textBrowser->append()'.

    Here is my code:

    void Widget::rcvInstrStat(QByteArray data){
        // Receive and process instrument status data
    
        if (data.length() == 5) {  // have we received 5 bytes?
            if (isDebugModeOn) {
                ui->textBrowser->append("Status data received - " + QString::number(data.length()) + " bytes.");
               // Display bytes in debug window
                for (int i=0; i<data.length(); i++) {
                    ui->textBrowser->append("Byte: " + QString::number(data.at(i),2));
                }
                ui->textBrowser->append("Instrument status has changed.");
            }
    
            instrStat = data;  // save the new status
            updInstrStat(data);  // carry out update process
        }
    }
    

    What happens is a bit strange. It generally works OK with an output like:

    Status data received - 5 bytes.
    Byte: 100101
    Byte: 11111
    Byte: 0
    Byte: 0
    Byte: 101001
    Instrument status has changed.

    which allows me to see which bits are set. However, it would seem that for larger numbers (>128?) I get this:

    Status data received - 5 bytes.
    Byte: 1111111111111111111111111111111111111111111111111111111111000101
    Byte: 11111
    Byte: 0
    Byte: 0
    Byte: 101001
    Instrument status has changed.

    Obviously a byte should have 8 bits, so what's with the long string of 1s? If I set QString::Number to return the data in decimal, then it turns out that instead of getting what should be 197, I get -59. It so happens that 256-59 = 197 so it seems I am getting an inverse representation of the value in 64 bits. I tried substituting 'data.at(i)' with the literal number 197 and it then returned the string 11000101 as expected. Evidently the problem is with converting individual bytes from the QByteArray. Please note that I have also tried using data[i] instead of data.at(i), but it makes no difference.

    My code in updInstrStat() still seems to work OK and appears to be still responding correctly to specific bits being set, so it would appear that this is a display issue rather than a problem with the actual data being received although given the output being produced, it is difficult to say with full confidence.

    1 Reply Last reply
    0
    • Q Offline
      Q Offline
      Qcontinuum
      wrote on last edited by Qcontinuum
      #2

      Ok, with a bit more digging I think I have solved this myself. I am however wondering whether there is a neater way?

      void Widget::rcvInstrStat(QByteArray data){
          // Receive and process instrument status data
         unsigned char c;
      
          if (data.length() == 5) {  // have we received 5 bytes?
              if (isDebugModeOn) {
                  ui->textBrowser->append("Status data received - " + QString::number(data.length()) + " bytes.");
                 // Display bytes in debug window
                  for (int i=0; i<data.length(); i++) {
                      c = data[i];
                      ui->textBrowser->append("Byte" + QString::number(i+1) + ": " + QString("%1").arg(c, 8, 2, QChar('0')));
                  }
                  ui->textBrowser->append("Instrument status has changed.");
              }
      
              instrStat = data;  // save the new status
              updInstrStat(data);  // carry out update process
          }
      }
      

      The output now includes padding and byte count to make it more readable:

      Byte1: 11000101
      Byte2: 00011111
      Byte3: 00000000
      Byte4: 00000000
      Byte5: 00101001

      However, if there is a better or more efficient way to accomplish this then I would be interested in some feedback.

      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