私のプログラムでは、シリアル通信を頻繁に使用するため、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)
上記の答えに触発されて、私は最終的に思いついたものです:
const quint8 testData[] {0xB1, 0x00, 0xB2, 0x00};
const QCanBusFrame cFrame = QCanBusFrame(
0xA1, QByteArray(reinterpret_cast<const char*>(testData), sizeof(testData)));
シリアル通信で作業するときは、リテラル文字ではなくバイト番号としてバイトを使用する方がはるかに好きです。
## c ++について話し合った後、reinterpret_cast
はこの状況で適切に使用されます。
シンプルで効果的:
QByteArray b = QByteArrayLiteral("\x12\x00\xa4\x42\x51\x00\x00\x99");
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);
}
このような:
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バイトを配列に追加することもできますが、通常、シーケンスの途中でゼロバイトを使用できます。
ゆっくり動作する可能性があります:
QByteArray ba = QByteArray::fromHex(QVariant("B1B2FFEEEE00").toByteArray());
次のことを試しましたか?
_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)
。
サイズが負の場合、データはヌル終了文字列を指していると見なされ、その長さは動的に決定されます。終了するヌル文字は、バイト配列の一部とは見なされません。