有没有一种较短的方法来初始化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
所能容纳的范围大——但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("xB1xB2 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);
}
可能工作缓慢:
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字符不被视为字节数组的一部分。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 在C++中初始化向量映射的最有效方法
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 初始化指向类实例的智能指针并访问其方法
- 不同的类或结构初始化方法之间的性能差异是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在C++中全局初始化类的正确方法
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 初始化类的两种方法?
- C++初始化之前派生类调用基类的方法
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- 使用静态方法初始化 const 类字段的做法是好是坏
- 是否可以使用自动类方法初始化自动变量?
- 指针类成员在通过类方法初始化后保持 NULL
- 从构造函数中本地声明的device_vector使用device_vector::data()方法初始化结构内部的指针是
- 使用什么方法初始化成员变量?
- 是否有更好的方法初始化引用成员以引用同一类中的另一个成员
- 混淆了定义自定义优先级队列和使用C++中的make_heap等方法初始化堆之间的区别