In my program I work a lot with serial communication so QByteArray
is used very often.
I was wondering if there was a shorter way to initialize a QByteArray
with specific bytes than:
const char test_data[] = {
static_cast<char>(0xB1), static_cast<char>(0xB2),
0x5, static_cast<char>(0xFF),
static_cast<char>(0xEE), static_cast<char>(0xEE),
static_cast<char>(0x0)}; // Note QByteArray should be able to hold 0 byte
const QCanBusFrame frame = QCanBusFrame(0xA1, QByteArray(test_data));
The static_cast<char>
is necessary because otherwise C++11 gives an error about narrowing, because the range 0x7F to 0xFF is bigger than a char
could fit--but a char
is what the QByteArray
constructor asks for.
This is the QByteArray
constructor being used:
QByteArray::QByteArray(const char *data, int size = -1)
May be works slowly:
As an alternative to
QByteArrayLiteral
, you can roll your own, if you wish:Simple and effective:
Being inspired by the answers above this is what I finally came up with:
I much prefer to have the bytes as byte numbers rather than literal characters when working with serial communication.
After having a discussion on ##c++ I was advised that
reinterpret_cast
is appropriately used in this situation.Have you tried the following:
You are using the constructor:
QByteArray::QByteArray(const char *data, int size = -1)
.like this:
now QByteArray constructor looks weird, but byte sequences are clear. You can also add terminating 0-byte to array instead of using
std::extent
, but in general you can have zero-bytes in the middle of sequence.