14

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

我想知道是否有比以下更短的方法来初始化 aQByteArray特定字节:

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 的范围比 achar可能适合的范围大——但 acharQByteArray构造函数所要求的。

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

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

4

6 回答 6

34

简单有效:

QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
于 2016-03-31T08:30:28.790 回答
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);
}
于 2016-03-31T16:56:17.807 回答
5

可能工作缓慢:

QByteArray ba = QByteArray::fromHex(QVariant("B1B2FFEEEE00").toByteArray());
于 2017-01-31T09:44:11.363 回答
4

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

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

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

在讨论了##c++ 之后,有人建议我reinterpret_cast在这种情况下适当地使用它。

于 2016-03-31T15:20:49.670 回答
3

像这样:

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,但通常您可以在序列中间添加零字节。

于 2016-03-31T08:26:35.387 回答
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).

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

于 2016-03-31T08:18:50.700 回答