Convert a QByteArray in Hex to a Struct
-
Hello,
I am reading an hex chain from a file with QDataStream. I have to put this hex chain into
a struct, I am trying to do it like this:QDataStream in(fileData); QByteArray header(sizeof(struct header), Qt::Uninitialized); struct header *hdd; in.readRawData(header.data(), sizeof(struct header)); hdd = reinterpret_cast<struct header *>(header.toHex().data());]
This is not working unfortunately, is there a way to do so ? otherwise I should decode members of the struct one by one and assign them individually.
Thank you in advance
EDIT
Some precisions:
The file is a binary.
Here is the structure:struct header{ int ver_global; int ver_qdatastream; int sampling_freq; quint8 tag; int nb_analog_input; int bloc_size; int ver_param; int year; int month; int day; int hour; int minutes; int seconds; int milliseconds; QString patient_fst_name; QString patient_lst_name; int year_birth; int month_birth; int day_birth; int nb_analog_inputs; int ver_calib; int ver_qdatastream2; // Val1 QString input1_name; QString input1_unit; short input1_precision; int input1_min; int input1_max; double input1_nb_unit_at_0; double input1_nb_unit_by_volt; double input1_val; bool input1_validity; bool input1_status; QString input1_name_abr; // Val2 QString input2_name; QString input2_unit; short input2_precision; int input2_min; int input2_max; double input2_nb_unit_at_0; double input2_nb_unit_by_volt; double input2_val; bool input2_validity; bool input2_status; QString input2_name_abr; // Val3 QString input3_name; QString input3_unit; short input3_precision; int input3_min; int input3_max; double input3_nb_unit_at_0; double input3_nb_unit_by_volt; double input3_val; bool input3_validity; bool input3_status; QString input3_name_abr; // Val4 QString input4_name; QString input4_unit; short input4_precision; int input4_min; int input4_max; double input4_nb_unit_at_0; double input4_nb_unit_by_volt; double input4_val; bool input4_validity; bool input4_status; QString input4_name_abr; };
-
Hello,
I am reading an hex chain from a file with QDataStream. I have to put this hex chain into
a struct, I am trying to do it like this:QDataStream in(fileData); QByteArray header(sizeof(struct header), Qt::Uninitialized); struct header *hdd; in.readRawData(header.data(), sizeof(struct header)); hdd = reinterpret_cast<struct header *>(header.toHex().data());]
This is not working unfortunately, is there a way to do so ? otherwise I should decode members of the struct one by one and assign them individually.
Thank you in advance
EDIT
Some precisions:
The file is a binary.
Here is the structure:struct header{ int ver_global; int ver_qdatastream; int sampling_freq; quint8 tag; int nb_analog_input; int bloc_size; int ver_param; int year; int month; int day; int hour; int minutes; int seconds; int milliseconds; QString patient_fst_name; QString patient_lst_name; int year_birth; int month_birth; int day_birth; int nb_analog_inputs; int ver_calib; int ver_qdatastream2; // Val1 QString input1_name; QString input1_unit; short input1_precision; int input1_min; int input1_max; double input1_nb_unit_at_0; double input1_nb_unit_by_volt; double input1_val; bool input1_validity; bool input1_status; QString input1_name_abr; // Val2 QString input2_name; QString input2_unit; short input2_precision; int input2_min; int input2_max; double input2_nb_unit_at_0; double input2_nb_unit_by_volt; double input2_val; bool input2_validity; bool input2_status; QString input2_name_abr; // Val3 QString input3_name; QString input3_unit; short input3_precision; int input3_min; int input3_max; double input3_nb_unit_at_0; double input3_nb_unit_by_volt; double input3_val; bool input3_validity; bool input3_status; QString input3_name_abr; // Val4 QString input4_name; QString input4_unit; short input4_precision; int input4_min; int input4_max; double input4_nb_unit_at_0; double input4_nb_unit_by_volt; double input4_val; bool input4_validity; bool input4_status; QString input4_name_abr; };
-
@DSpider thats most likely possible, but to tell more we'd need to see the struct definition.
Also, is the file a binary or an ASCII file with hex chars?
-
Hi,
How are you writing the structure to file in the first place ?
-
@SGaist I actually don't know. I am supposed to read only, another program (I don't have access to) does the writting.
-
Would it be possible for you to request to know how it's done ?
If the writing is done using QDataStream it will simplify things.
-
Would it be possible for you to request to know how it's done ?
If the writing is done using QDataStream it will simplify things.
-
QDataStream in(fileData); struct header; in >> header;
You should check whether the QDataStream used has its version set. If not, then you should suggest to add that so that you can ensure that if a future version of Qt changes some aspect of the QDataStream protocol you can still read the old files you have generated.
-
QDataStream in(fileData); struct header; in >> header;
You should check whether the QDataStream used has its version set. If not, then you should suggest to add that so that you can ensure that if a future version of Qt changes some aspect of the QDataStream protocol you can still read the old files you have generated.
-
if the writing was done like this:
QDataStream out(file); out << myStruct:
then there's nothing special to do.
-
if the writing was done like this:
QDataStream out(file); out << myStruct:
then there's nothing special to do.
-
I knew I was forgetting something, you have to implement the QDataStream operator for the structure.
Which is something that has likely be done for the other application. The operators implementation boils down to sending each field to the output stream and read each field from the input stream.
-
@SGaist said in Convert a QByteArray in Hex to a Struct:
The operators implementation boils down to sending each field to the output stream and read each field from the input stream.
I was wondering about that. I read a bunch of articles last week about transferring binary data. Two of the major concerns are binary alignment/packing and endianess. Does the QDataStream address both of those issues? I am more concerned with the alignment/packing as all our systems are little endian. The alignment/packing can change if compiler settings are changed.
Edit:
Sorry, I should have just looked it up:
http://doc.qt.io/qt-5/qdatastream.html -
I knew I was forgetting something, you have to implement the QDataStream operator for the structure.
Which is something that has likely be done for the other application. The operators implementation boils down to sending each field to the output stream and read each field from the input stream.
-
Yes it is, but you have to ensure the the writing was done in the same order.
-
You're welcome !
Qt is C++ so by learning the second you'll be able to master the first :)