web-dev-qa-db-ja.com

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>_が必要なのは、0x7Fから0xFFの範囲がcharの範囲よりも大きいため、C++ 11でナローイングに関するエラーが発生するためです。ただし、charが必要です。 QByteArrayコンストラクターが要求します。

これは、使用されているQByteArrayコンストラクターです。

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

9
DBedrenko

上記の答えに触発されて、私は最終的に思いついたものです:

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

シリアル通信で作業するときは、リテラル文字ではなくバイト番号としてバイトを使用する方がはるかに好きです。

## c ++について話し合った後、reinterpret_castはこの状況で適切に使用されます。

2
DBedrenko

シンプルで効果的:

QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
24
peppe

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);
}
4
Kuba Ober

このような:

const unsigned char str[] = {0xff, 0xed, 0xba, 0xd1};
QByteArray ba(reinterpret_cast<const char*>(&str[0]),std::extent<decltype(str)>::value);

qByteArrayコンストラクターは奇妙に見えますが、バイトシーケンスは明確です。 std::extentを使用する代わりに、終了する0バイトを配列に追加することもできますが、通常、シーケンスの途中でゼロバイトを使用できます。

2
Andrei R.

ゆっくり動作する可能性があります:

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

次のことを試しましたか?

_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)

サイズが負の場合、データはヌル終了文字列を指していると見なされ、その長さは動的に決定されます。終了するヌル文字は、バイト配列の一部とは見なされません。

0
OnurA