[Solved]Convert ASCII hex to int
-
@leon.anavi said in [Solved]Convert ASCII hex to int:
bool bStatus = false;
-
Hello,
i have simular problem:
i have a txt file with hex values in it, i want ro read them and store in a qvector.When I use your code I get error in qlist.h
this is part of my code:{ bool bStatus = false; qDebug() << line; QStringList fields = line.split(' '); x.append(tick); tick++; y1.append(fields.at(1).toUInt(&bStatus,16)); y2.append(fields.at(1).toUInt(&bStatus,16)); y3.append(fields.at(1).toUInt(&bStatus,16));
-
Hi @Leopold,
Unfortunately you didn't tell us which error you got.
Nevertheless, there are several (potential) problems in your code.
- You split line in a
QStringList fields
, but don't check if the list contains more than one element before callingat(1)
. This can crash. - You have a variable
bStatus
and give it to as Parameter totoUInt()
, but don't check the value ofbStatus
- You call the sequence
fields.at(1).toUInt(&bStatus,16)
three times. I'd store the result in a temporary value to avoid this duplication
Regards
- You split line in a
-
Hello,
the error is a hint to line 531 in qlist.h
"{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");"
I know the fields are always the same so the number of y is the same too.Giving the same value to three different vectors in a while loop should not be the problem. But I will change that. -
@Leopold said in [Solved]Convert ASCII hex to int:
Hello,
the error is a hint to line 531 in qlist.h
"{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");"So take care to check
fields.size()
before callingfields.at(1)
. This should solve your problem. -
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? -
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 }
-
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;
-
@ 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
-
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+"));
-
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" -
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. -
@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 ... -
@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). -
I tried this:
{ // iterate over all the matchesconst 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)); }
-
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)