有没有更短的方法来初始化QByteArray?

DBe*_*nko 8 c++ qt qbytearray c++11 qt5.6

在我的程序中,我通过串行通信工作很多,因此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));
Run Code Online (Sandbox Code Playgroud)

static_cast<char>是必要的,因为否则C++ 11会出现关于缩小的错误,因为0x7F到0xFF的范围大于a char可能适合的范围 - 但是a charQByteArray构造函数要求的.

这是使用的QByteArray构造函数:

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

pep*_*ppe 24

简单有效:

QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
Run Code Online (Sandbox Code Playgroud)

  • 我想知道[记录在案](https://codereview.qt-project.org/#/c/195544/)的... (2认同)
  • Qt 的任何其他主要版本均已达到 EOL。 (2认同)

Rei*_*ica 5

作为 的替代方案QByteArrayLiteral,如果您愿意,您可以推出自己的产品:

#include <QByteArray>

template <int N> QByteArray arrayFromLiteral(const char (&data)[N]) {
   return QByteArray::fromRawData(data, N-1);
}

int main() {
   const auto arr = arrayFromLiteral("\xB1\xB2\0\1");
   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);
}
Run Code Online (Sandbox Code Playgroud)


And*_*kov 5

可能工作缓慢:

QByteArray ba = QByteArray::fromHex(QVariant("B1B2FFEEEE00").toByteArray());
Run Code Online (Sandbox Code Playgroud)


DBe*_*nko 4

受到上述答案的启发,我最终想出了:

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

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

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