有没有一种较短的方法来初始化QByteArray

Is there a shorter way to initialize a QByteArray?

本文关键字:方法 初始化 QByteArray 一种 有没有      更新时间:2023-10-16

在我的程序中,我经常使用串行通信,因此QByteArray非常常用。

我想知道是否有比更短的方法来初始化具有特定字节的QByteArray

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));

static_cast<char>是必要的,因为否则C++11会给出缩小范围的错误,因为0x7F到0xFF的范围比char所能容纳的范围大——但QByteArray构造函数所要求的是char

这是正在使用的QByteArray构造函数:

QByteArray::QByteArray(const char *data, int size = -1)

简单有效:

QByteArray b = QByteArrayLiteral("x12x00xa4x42x51x00x00x99");

作为QByteArrayLiteral的替代方案,如果您愿意,您可以自己滚动:

#include <QByteArray>
template <int N> QByteArray arrayFromLiteral(const char (&data)[N]) {
   return QByteArray::fromRawData(data, N-1);
}
int main() {
   const auto arr = arrayFromLiteral("xB1xB21");
   Q_ASSERT(arr.size() == 4);
   Q_ASSERT(arr[0] == (char)0xB1);
   Q_ASSERT(arr[1] == (char)0xB2);
   Q_ASSERT(arr[2] == (char)0x00);
   Q_ASSERT(arr[3] == (char)0x01);
}

可能工作缓慢:

QByteArray ba = QByteArray::fromHex(QVariant("B1B2FFEEEE00").toByteArray());

受到以上答案的启发,我终于想出了这个:

const quint8 testData[] {0xB1, 0x00, 0xB2, 0x00};
const QCanBusFrame cFrame = QCanBusFrame(
    0xA1, QByteArray(reinterpret_cast<const char*>(testData), sizeof(testData)));

在处理串行通信时,我更喜欢将字节作为字节数,而不是文字字符。

在对##c++进行讨论后,建议我在这种情况下适当使用reinterpret_cast

如下:

const unsigned char str[] = {0xff, 0xed, 0xba, 0xd1};
QByteArray ba(reinterpret_cast<const char*>(&str[0]),std::extent<decltype(str)>::value);

现在QByteArray构造函数看起来很奇怪,但字节序列很清楚。您也可以将终止的0字节添加到数组中,而不是使用std::extent,但通常情况下,您可以在序列的中间有0字节。

您尝试过以下操作吗:

const unsigned 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>(0xB3)};
const QCanBusFrame frame = QCanBusFrame(0xA1, QByteArray((char*)test_data));

您正在使用构造函数:QByteArray::QByteArray(const char *data, int size = -1)

如果大小为负数,则假定数据指向一个以nul结尾的字符串,并且其长度是动态确定的。终止的nul字符不被视为字节数组的一部分。