Solved How can convert vector<std::complex<qint32>> to QByteArray ?
-
Is it possible to convert vector<std::complex<qint32>> to QByteArray ?
-
@isan
I think it depends on what you mean by "convert".std::complex<qint32>
is not an array of bytes, but in some shape or form its content be copied to bytes if that is what you want to do, but you must do the work yourself. I think you should read the Array-oriented access section in https://en.cppreference.com/w/cpp/numeric/complex to see how you can access the real & imaginary parts directly, and thereal()
&imag()
member methods. -
Yes but you have to do the serialization by your own.
-
@Christian-Ehrlicher can explain more about the serialization?
-
@isan
You have to write the code to produce theQByteArray
from thestd::complex
value ("serialization"), and thestd::complex
from theQByteArray
("deserialization"). There is nothing in-built to do that for you. Which is why I gave you the links to achieve that. In particular the array-like access, which you may wish to employ. -
@JonB Thank you for your response
I have access to real and img part, what to do after it?well I do this for reverse mode
for (int i = 0; i <SHOT_SIZE; i++) { QByteArray sample= mDataFile->read(dataRead); qint32 *complex= (qint32 *)sample.data(); double Real = double(complex[1]); double Imag = double(complex[0]); }
-
@isan
Start with: you asked aboutstd::complex<qint32>
.Why are you now using[you seem to be keeping on editing your code...], and why are you doingqint16
anythingdouble
anything? (This may be going beyond my math knowledge!)Separately, you are using C-style cast
(qint32 *)
. If you expect this to be portable across platforms, you are ignoring byte-ordering-endianness here? Who is doing the serialization (complex -> byte array -> file) in the first place (e.g. is it your code or someone else's), how (what byte order) are the integers stored?I have access to real and img part, what to do after it?
std::complex<double> cmplx(Real, Imag);
-
@JonB So What difference does it make if I have real data and img or not when we complex them up in the end?
I do thisvector<std::complex<qint32>> cmplxData; QByteArray* byteData = new QByteArray(reinterpret_cast<const char*>(cmplxData.data(), cmplxIQ.size()*sizeof (std::complex<qint32>));
and it worked
-
@isan
In a word: you are making certain assumptions about the memory layout ofstd::complex<qint32>
, and of astd::vector
. If that works for you, it works. Whether it's robust I don't know. Nor am I sure how you are going to deserialize like this, i.e. restore from theQByteArray
to avector<std::complex<qint32>>
.Separately, as I observed earlier, this code will not work if you exchange data between different platforms where the endianness differs.