有没有更短的方法来初始化 QByteArray?
Is there a shorter way to initialize a QByteArray?
在我的程序中,我经常使用串行通信,因此经常使用 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
所能容纳的要大——但是 char
是 QByteArray
构造函数要求的。
这是正在使用的 QByteArray
构造函数:
QByteArray::QByteArray(const char *data, int size = -1)
您是否尝试过以下方法:
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)
。
If size is negative, data is assumed to point to a nul-terminated string and its length is determined dynamically. The terminating nul-character is not considered part of the byte array.
像这样:
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
,但通常您可以在序列的中间有零字节。
简单有效:
QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
受到上述答案的启发,这就是我最终想到的:
const quint8 testData[] {0xB1, 0x00, 0xB2, 0x00};
const QCanBusFrame cFrame = QCanBusFrame(
0xA1, QByteArray(reinterpret_cast<const char*>(testData), sizeof(testData)));
在使用串行通信时,我更喜欢将字节作为字节数而不是文字字符。
在对##c++ 进行讨论后,有人建议我在这种情况下适当使用 reinterpret_cast
。
作为 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[=10=]");
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());
在我的程序中,我经常使用串行通信,因此经常使用 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
所能容纳的要大——但是 char
是 QByteArray
构造函数要求的。
这是正在使用的 QByteArray
构造函数:
QByteArray::QByteArray(const char *data, int size = -1)
您是否尝试过以下方法:
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)
。
If size is negative, data is assumed to point to a nul-terminated string and its length is determined dynamically. The terminating nul-character is not considered part of the byte array.
像这样:
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
,但通常您可以在序列的中间有零字节。
简单有效:
QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
受到上述答案的启发,这就是我最终想到的:
const quint8 testData[] {0xB1, 0x00, 0xB2, 0x00};
const QCanBusFrame cFrame = QCanBusFrame(
0xA1, QByteArray(reinterpret_cast<const char*>(testData), sizeof(testData)));
在使用串行通信时,我更喜欢将字节作为字节数而不是文字字符。
在对##c++ 进行讨论后,有人建议我在这种情况下适当使用 reinterpret_cast
。
作为 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[=10=]");
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());