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

C++ 有没有一种较短的方法来初始化QByteArray?,c++,qt,c++11,qbytearray,qt5.6,C++,Qt,C++11,Qbytearray,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

在我的程序中,我经常使用串行通信,因此经常使用
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));
const char test_data[]{
静态强制转换(0xB1),静态强制转换(0xB2),
0x5,静态_转换(0xFF),
静态广播(0xEE),静态广播(0xEE),
静态_cast(0x0)};//注:QByteArray应能容纳0字节
常量QCanBusFrame=QCanBusFrame(0xA1,QByteArray(测试数据));
static\u cast
是必需的,因为否则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));
const无符号字符测试数据[]={
静态强制转换(0xB1),静态强制转换(0xB2),
0x5,静态_转换(0xFF),
静态广播(0xEE),静态广播(0xEE),
静态_cast(0xB3)};
常量QCanBusFrame=QCanBusFrame(0xA1,QByteArray((char*)测试数据));
您正在使用构造函数:
QByteArray::QByteArray(const char*data,int size=-1)

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

像这样:

const unsigned char str[] = {0xff, 0xed, 0xba, 0xd1};
QByteArray ba(reinterpret_cast<const char*>(&str[0]),std::extent<decltype(str)>::value);
const unsigned char str[]={0xff,0xed,0xba,0xd1};
QByteArray ba(重新解释铸件(&str[0]),标准::范围::值);
现在QByteArray构造函数看起来很奇怪,但字节序列很清楚。您还可以将终止0字节添加到数组中,而不是使用 STD::Leals,但一般来说,可以在序列中间有0个字节。

< P>简单有效:

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)));
constquint8testdata[]{0xB1,0x00,0xB2,0x00};
常量QCanBusFrame cFrame=QCanBusFrame(
0xA1,QByteArray(重新解释(测试数据),sizeof(测试数据));
在处理串行通信时,我更喜欢将字节作为字节数,而不是文字字符


在讨论了##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\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);
}
#包括
模板QByteArray arrayFromLiteral(常量字符和数据)[N]){
返回QByteArray::fromRawData(数据,N-1);
}
int main(){
const auto arr=arrayFromLiteral(“\xB1\xB2\0\1”);
Q_断言(arr.size()==4);
Q_断言(arr[0]=(char)0xB1);
Q_断言(arr[1]=(char)0xB2);
Q_断言(arr[2]=(char)0x00);
Q_断言(arr[3]=(char)0x01);
}
可能工作缓慢:

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

当您将测试数据声明为无符号字符数组(unsigned char*),然后将其强制转换为字符数组(char*)时会发生什么情况?@OnurA您确定需要使用星号吗?inits
test_data
抛出“从'int'到'const unsigned char*的无效转换”的那一行。您可以轻松创建一个函数,该函数创建一个
QByteArray
,并将所需作为参数。您的任何字节值都可以是0x00吗?如果不是,您可以使用带有字符串的const char*构造函数literal@Jimmy你说得对,可以将“\x01\xB2\xB4”传递给构造函数,但最好使用整数(可以使用常量名称等)。我应该能够有一个“0”字节,虽然…我刚刚尝试了它,它编译成功。它不需要所有的
静态转换
(您的解决方案的全部好处是不需要这些转换)。我不确定使用0字节时应该注意什么:我还需要能够使用0字节。您绝对需要调用
QByteArray((char*)test_data,sizeof(test_data))!单参数ctor(或size=-1)将尝试将数据复制为普通c字符串,该字符串必须以null结尾!如果你在中间有一个0x00,它会检测到你的字符数组的结尾。这就是为什么我会通过数组大小,因为这是我最喜欢的解决方案,但C样式转换不好。我现在正试图找到一种使用
static\u cast
的方法。出于好奇,你能解释一下为什么需要重新解释和std::extent吗?我喜欢重新解释(C++风格,而不是C)。用sizeof(str)代替extent…你不能用str代替&str[0](对我来说很难看)吗?至少GCC接受……嗯,我没有看到任何地方记录了
QByteArray
,但是上帝保佑,它比传递给
QByteArray
的完全相同的参数工作得更好,因为“\x00”不被视为字符串终止符。使用
QByteArray
也可以实现同样的效果,但必须传递正确的
size
参数。这是一个不错的解决方案,谢谢:)@DBedrenko这只是一个宏:我想知道那个人是谁…只有从QT5开始出现任何其他主要版本的Qt已经达到EOL。