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. [Solved]Convert ASCII hex to int

[Solved]Convert ASCII hex to int

Scheduled Pinned Locked Moved General and Desktop
27 Posts 7 Posters 50.0k 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.
  • L Offline
    L Offline
    Leopold
    wrote on last edited by
    #10

    Hello,
    my problem seems to be the line.split
    QStringList fields = line.split(' ');
    this is a file with ' ' separation
    like "80: 1C 02 FC 85 FF 1D"

    jsulmJ 1 Reply Last reply
    0
    • L Leopold

      Hello,
      my problem seems to be the line.split
      QStringList fields = line.split(' ');
      this is a file with ' ' separation
      like "80: 1C 02 FC 85 FF 1D"

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #11

      @Leopold Can you do

      qDebug() << line;
      qDebug() << fields;
      

      and post the output here?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1
      • L Offline
        L Offline
        Leopold
        wrote on last edited by
        #12

        In the meanwhile i have found how to split white space but it does not work.This is my split command:
        QStringList fields = line.split("\s+");
        this is qDebug()<<fields :("80: 1C 02 FC 85 FF 4F FF 1D 89 17 08 10 01 00 00 00 3B 87 69 00 82 00 48 09 88 10 00 00 ")
        what other split commands for white space are possible?

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by VRonin
          #13
          const QRegularExpression hexRegExp(QStringLiteral("[0-9a-fA-F]{2}(?!:)"));  // regular expression that matches 2 hex digits NOT followed by :
          for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);i.hasNext();){ // iterate over all the matches
          const QRegularExpressionMatch hexMatch = i.next();
          qDebug() << "Hex: " << hexMatch.capturedRef(0) << " Dec: " << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
          }
          

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          3
          • M Offline
            M Offline
            mpergand
            wrote on last edited by mpergand
            #14

            Using a QByteArray is the way to go !

            QString hex="80 1c,02:fc 85, ff* 1000";  // the separator can be any non hex char
            QByteArray values=QByteArray::fromHex(hex.toLatin1());
            qDebug()<<values;
            for(quint8 c : values)  // note the quint8
              qDebug()<<c;
            
            1 Reply Last reply
            1
            • L Offline
              L Offline
              Leopold
              wrote on last edited by VRonin
              #15

              @ VRonin
              sorry , could you explain line by line, i normaly can read c-code but this is too complex and I would like to understand.On the other hand, when I put this code into mine I get a lot of errors.Here is part of my code. I have to examine first field and according to its value read the lines into different vectors.
              i need an expression that the line will be split,every ( to me) known didn't work up to know.
              my code:

              if (line_count>3) // read line from line 4
              							{
                                              QStringList fields = line.split("[\s]+");// not working
                                                qDebug()<<fields;// shows complete line, should be first field
                                               Eingang.append(fields.at(0));// its a QString declared earlier
                                               qDebug()<<Eingang;             
                                               if( Eingang==("80:"))// then read this line
              								{
              								 bool bStatus = false;
                                               qDebug() << line;
                                               x.append(tick); // this will be x-line in a plot
                                               tick++;
                                          
                                               y1.append(fields.at(1).toUInt(&bStatus,16));// one graph inplot
                                               y2.append(fields.at(2).toUInt(&bStatus,16));// second graph in plot
                            
              								}
                                              else if ( Eingang== ("7D:"))
              								{
                                                  bool bStatus = false;
                                                  qDebug() << line;
                                                  QStringList fields = line.split("\\s+");// didn't work too
                                                  x.append(tick);
                                                  tick++;
                                               y29.append(fields.at(1).toUInt(&bStatus,16));
                                               y30.append(fields.at(2).toUInt(&bStatus,16));
                                   
              								}
              							}
              						}		 
              

              and here part of the file:

              Running command: read-raw
              ECU responded to D0 command with: 98 00 01 02
              
              80: 1C 02 FC 85 FF 4F FF 1D 89 17 08 10 01 00 00 00 3B 87 69 00 82 00 48 09 88 10 00 00 
              7D: 20 10 1C FF 92 00 A8 FF FF 01 01 7D 59 00 FF 51 FF FF 30 80 7F 7F FF 01 00 07 00 0D C0 1E 00 45 
              80: 1C 03 0C 85 FF 4F FF 1E 89 17 08 10 01 00 00 00 3B 87 69 00 82 00 48 09 88 10 00 00 
              7D: 20 10 1C FF 92 00 9D FF FF 01 01 7D 59 00 FF 51 FF FF 30 80 7F 6D FF 01 00 07 00 0D C0 1E 00 45 
              80: 1C 02 F8 85 FF 4F FF 1E 89 17 08 10 01 00 00 00 3B 87 69 00 8C 00 48 09 88 10 00 00 
              7D: 20 10 1C FF 92 00 43 FF FF 01 01 7D 58 00 FF 51 FF FF 30 80 7F 79 FF 01 00 07 00 0D C0
              
              1 Reply Last reply
              0
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by VRonin
                #16

                could you explain line by line

                Added comments, for more info just look here: http://doc.qt.io/qt-5/qregularexpression.html#global-matching

                On the other hand, when I put this code into mine I get a lot of errors

                what errors? if it's because you don't support C++11 for some reason I changed the code so it works on old compilers

                if( Eingang==("80:"))

                add a regular expression for that too:

                const QRegularExpression eingangExp(QStringLiteral("^\\s*([0-9a-fA-F]{2}):"));
                const QRegularExpression hexRegExp(QStringLiteral("[0-9a-fA-F]{2}(?!:)"));
                const QRegularExpressionMatch eingangMatch = eingangExp.match(line);
                if(eingangMatch.hasMatch()){
                if(eingangMatch.capturedRef(1).compare("80",Qt::CaseInsensitive)==0){ // Eingang==("80:")
                qDebug() << "Eingang is 80";
                for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);i.hasNext();){ // iterate over all the matches
                const QRegularExpressionMatch hexMatch = i.next();
                qDebug() << "Hex: " << hexMatch.capturedRef(0) << " Dec: " << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                }
                }
                else if(eingangMatch.capturedRef(1).compare("7D",Qt::CaseInsensitive)==0){ // Eingang==("7D:"){
                qDebug() << "Eingang is 7D";
                for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);i.hasNext();){ // iterate over all the matches
                const QRegularExpressionMatch hexMatch = i.next();
                qDebug() << "Hex: " << hexMatch.capturedRef(0) << " Dec: " << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                }
                }
                }
                

                QStringList fields = line.split("[\s]+");// not working

                You have to tell split you are using a regexp and escape the \: QStringList fields = line.split(QRegularExpression("\\s+"));

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                1 Reply Last reply
                1
                • M Offline
                  M Offline
                  mpergand
                  wrote on last edited by
                  #17
                  QString line="80: 1C 02 FC 85 FF 4F FF 1D 89 17 08 10 01 00 00 00 3B 87 69 00 82 00 48 09 88 10 00 00 ";
                  QStringList fields=line.split(':');
                  qDebug()<<"en-tĂȘte:"<<fields[0];
                  QByteArray values=QByteArray::fromHex(fields[1].toLatin1());
                  qDebug()<<"data:"<<values;
                  

                  en-tĂȘte: "80"
                  data :"\x1C\x02\xFC\x85\xFFO\xFF\x1D\x89\x17\b\x10\x01\x00\x00\x00;\x87i\x00\x82\x00H\t\x88\x10\x00\x00"

                  1 Reply Last reply
                  3
                  • L Offline
                    L Offline
                    Leopold
                    wrote on last edited by
                    #18

                    heureka
                    VRonin's code works:
                    QVector()
                    "80: 1C 02 FC 85 FF 4F FF 1D 89 17 08 10 01 00 00 00 3B 87 69 00 82 00 48 09 88 10 00 00 "
                    4
                    QRegularExpressionMatch(Valid, has match: 0:(0, 3, "80:"), 1:(0, 2, "80"))
                    "1C" 28
                    "02" 2
                    "FC" 252
                    now I have to give eyh value to the different y
                    but I think I can gigure that out.

                    @mpergand
                    this will divide first field from rest but how to divide the rest?
                    y1= field1,y2=field2 and so on
                    but I will test.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      mpergand
                      wrote on last edited by mpergand
                      #19

                      @Leopold said in [Solved]Convert ASCII hex to int:

                      this will divide first field from rest but how to divide the rest?
                      y1= field1,y2=field2 and so on
                      but I will test.

                      No need to split anything, you can access each byte in a QByteArray with at() or []
                      See the doc ...

                      1 Reply Last reply
                      3
                      • L Offline
                        L Offline
                        Leopold
                        wrote on last edited by
                        #20

                        @VRonin
                        the example works great for transforming from hex to dec but i get the same row what i have in the txt now as a vektor. In my code you see that I have different y Vektors.
                        I need value of field1 in y1, field2 in y2 and so on.I can not figure out how to take the i into a loop with y(i).

                        VRoninV 1 Reply Last reply
                        0
                        • L Leopold

                          @VRonin
                          the example works great for transforming from hex to dec but i get the same row what i have in the txt now as a vektor. In my code you see that I have different y Vektors.
                          I need value of field1 in y1, field2 in y2 and so on.I can not figure out how to take the i into a loop with y(i).

                          VRoninV Offline
                          VRoninV Offline
                          VRonin
                          wrote on last edited by
                          #21

                          @Leopold Every time you call i.next(); it moves to the next field in order so it's quite easy to manage

                          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                          ~Napoleon Bonaparte

                          On a crusade to banish setIndexWidget() from the holy land of Qt

                          1 Reply Last reply
                          0
                          • L Offline
                            L Offline
                            Leopold
                            wrote on last edited by
                            #22

                            I tried this:
                            { // iterate over all the matches

                            										const QRegularExpressionMatch hexMatch = i.next();
                            										qDebug() <<  hexMatch.capturedRef(0) <<  hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                                                                    y1.append(hexMatch.capturedRef(1).toUInt(Q_NULLPTR,16));
                                                                     y2.append(hexMatch.capturedRef(2).toUInt(Q_NULLPTR,16));
                                                                      y3.append(hexMatch.capturedRef(3).toUInt(Q_NULLPTR,16));
                                                                       y4.append(hexMatch.capturedRef(4).toUInt(Q_NULLPTR,16));
                                                                }
                            
                            VRoninV 1 Reply Last reply
                            0
                            • L Leopold

                              I tried this:
                              { // iterate over all the matches

                              										const QRegularExpressionMatch hexMatch = i.next();
                              										qDebug() <<  hexMatch.capturedRef(0) <<  hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                                                                      y1.append(hexMatch.capturedRef(1).toUInt(Q_NULLPTR,16));
                                                                       y2.append(hexMatch.capturedRef(2).toUInt(Q_NULLPTR,16));
                                                                        y3.append(hexMatch.capturedRef(3).toUInt(Q_NULLPTR,16));
                                                                         y4.append(hexMatch.capturedRef(4).toUInt(Q_NULLPTR,16));
                                                                  }
                              
                              VRoninV Offline
                              VRoninV Offline
                              VRonin
                              wrote on last edited by
                              #23

                              @Leopold said in [Solved]Convert ASCII hex to int:

                              { // iterate over all the matches

                              Look at that comment. Do you see what you are doing wrong?

                              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                              ~Napoleon Bonaparte

                              On a crusade to banish setIndexWidget() from the holy land of Qt

                              1 Reply Last reply
                              0
                              • L Offline
                                L Offline
                                Leopold
                                wrote on last edited by VRonin
                                #24

                                yes I see that it is a loop but if i write :

                                 if(eingangMatch.hasMatch())
                                								{
                                									if(eingangMatch.capturedRef(1).compare("80",Qt::CaseInsensitive)==0)
                                									{ // Eingang==("80:")
                                										qDebug() << eingangMatch;
                                										for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);
                                
                                                                            i.hasNext();
                                
                                
                                                                            )
                                
                                
                                											const QRegularExpressionMatch hexMatch = i.next();
                                                                            qDebug() << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                                                                            y1.append(hexMatch.capturedRef(1).toUInt(Q_NULLPTR,16));
                                                                             y2.append(hexMatch.capturedRef(2).toUInt(Q_NULLPTR,16));
                                                                              y3.append(hexMatch.capturedRef(3).toUInt(Q_NULLPTR,16));
                                                                               y4.append(hexMatch.capturedRef(4).toUInt(Q_NULLPTR,16));
                                
                                
                                
                                                                }
                                

                                the qDebug() << eingangMatch; and qDebug() << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16);
                                don't work and all my y vectors get "0"
                                "80: 1C 05 3A 85 FF 4F FF 1D 89 1E 08 10 01 00 00 00 3B 87 51 01 AF 00 58 09 88 10 00 00 "
                                QVector(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
                                QVector(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

                                VRoninV 1 Reply Last reply
                                0
                                • L Leopold

                                  yes I see that it is a loop but if i write :

                                   if(eingangMatch.hasMatch())
                                  								{
                                  									if(eingangMatch.capturedRef(1).compare("80",Qt::CaseInsensitive)==0)
                                  									{ // Eingang==("80:")
                                  										qDebug() << eingangMatch;
                                  										for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);
                                  
                                                                              i.hasNext();
                                  
                                  
                                                                              )
                                  
                                  
                                  											const QRegularExpressionMatch hexMatch = i.next();
                                                                              qDebug() << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); //capturedRef contains the part matched by the regular expression
                                                                              y1.append(hexMatch.capturedRef(1).toUInt(Q_NULLPTR,16));
                                                                               y2.append(hexMatch.capturedRef(2).toUInt(Q_NULLPTR,16));
                                                                                y3.append(hexMatch.capturedRef(3).toUInt(Q_NULLPTR,16));
                                                                                 y4.append(hexMatch.capturedRef(4).toUInt(Q_NULLPTR,16));
                                  
                                  
                                  
                                                                  }
                                  

                                  the qDebug() << eingangMatch; and qDebug() << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16);
                                  don't work and all my y vectors get "0"
                                  "80: 1C 05 3A 85 FF 4F FF 1D 89 1E 08 10 01 00 00 00 3B 87 51 01 AF 00 58 09 88 10 00 00 "
                                  QVector(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
                                  QVector(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

                                  VRoninV Offline
                                  VRoninV Offline
                                  VRonin
                                  wrote on last edited by VRonin
                                  #25

                                  @Leopold said in [Solved]Convert ASCII hex to int:

                                  yes I see that it is a loop

                                  I don't think you do...

                                  int h=0;
                                  for(QRegularExpressionMatchIterator i = hexRegExp.globalMatch(line);i.hasNext();++h){
                                  const QRegularExpressionMatch hexMatch = i.next();
                                  qDebug() << hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16); 
                                  switch(h){
                                  case 1 : y1.append(hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16)); break;
                                  case 2 : y2.append(hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16)); break;
                                  case 3 : y3.append(hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16)); break;
                                  case 4 : y4.append(hexMatch.capturedRef(0).toUInt(Q_NULLPTR,16)); break;
                                  default: break;
                                  }
                                  }

                                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                  ~Napoleon Bonaparte

                                  On a crusade to banish setIndexWidget() from the holy land of Qt

                                  1 Reply Last reply
                                  0
                                  • L Offline
                                    L Offline
                                    Leopold
                                    wrote on last edited by
                                    #26

                                    i get error for the "i" no match for operator "++"
                                    and the switch operator is not an integer
                                    I copied the int i=0 as well
                                    btw:my compiler is mingw9-32 from QT 5.6.2

                                    1 Reply Last reply
                                    0
                                    • L Offline
                                      L Offline
                                      Leopold
                                      wrote on last edited by
                                      #27

                                      the i was occupied by the "QRegularExpressionMatchIterator"
                                      i changed int i to int h then ++h and switch h and it works.
                                      Thank you great!

                                      1 Reply Last reply
                                      1

                                      • Login

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