2016-03-31 137 views
6

在我的程序中,我使用了很多串行通信,因此经常使用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构造函数所要求的。

这是所使用的QByteArray构造:

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

+0

会发生什么数组(无符号字符*),然后将其转换为char数组(char *)? – OnurA

+0

@OnurA你确定需要使用星号吗? in'test_data'中的行将'int'无效转换为'const unsigned char *' – DBedrenko

+0

您可以很容易地创建一个函数,它可以用你想要的参数创建一个'QByteArray'。 – Garf365

回答

2

正由上面这个问题的答案的启发是什么,我终于想出了:

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

我更喜欢有字节字节数,而不是字面使用串行通信时的字符。

在讨论了## C++之后,我被告知reinterpret_cast在这种情况下被适当地使用。

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-字符不被视为字节数组的一部分。

+0

,但我会小心零并传递数组大小作为参数。 – OnurA

+1

我只是试过了,它编译成功。它的工作原理没有所有的'static_cast'(你的解决方案的全部好处是不需要这些强制转换)。我不知道我应该小心使用0字节:我需要能够使用0字节。 – DBedrenko

+1

你绝对需要调用'QByteArray((char *)test_data,sizeof(test_data));'!单个参数ctor(或者大小== -1)将尝试将数据复制为正常的c字符串,这将不得不以null结尾! – Aconcagua

2

这样的:

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

仅仅因为好奇,你能解释为什么reinterpret_cast和std :: extent是必需的吗? – OnurA

+1

我喜欢reinterpret_cast(C++风格,而不是C)。而不是范围,只是使用sizeof(str)... – Aconcagua

+0

难道你不能只施放str而不是&str [0](对我来说看起来很丑)?至少GCC接受... – Aconcagua

17

简单有效:

QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99"); 
+0

嗯我没有看到'QByteArrayLiteral'记录在任何地方,但由于上帝,它比传递给'QByteArray'完全相同的参数更好,因为“\ x00”不被视为字符串终止符。 'QByteArray'可以达到同样的效果,但是你必须传递正确的'size'参数。不是一个坏的解决方案,谢谢:) – DBedrenko

+1

@DBedrenko这只是一个宏:http://doc.qt.io/qt-5/qbytearray.html#QByteArrayLiteral – rbaleksandar

+0

我想知道_who_ [记录](https://codereview.qt -project.org/#/c/195544/)... – peppe

2

作为替代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); 
} 
1

可能是慢腾腾的:当你声明`test_data` unsigned char型

QByteArray ba = QByteArray::fromHex(QVariant("B1B2FFEEEE00").toByteArray()); 
相关问题