2017-12-07 3 views
0

Wie kann ich analysieren diese "\" getrennt HEX-Werte in der QByteArray in 8 separate int ist?Separate QByteArray Hex-Werte des trennen int

QByteArray mainArray = "\xFF\xFF\x01\x04\x01\x0B\x03\xEC"; 
int num1; 
int num2; 
int num3; 
... 
+0

Das [ 'QByteArray'] (http://doc.qt.io/qt-5/qbytearray.html) einen' Operator [] ' sowie eine 'size()' Methode. Es kann ähnlich wie ein 'std :: vector' verwendet werden. – Scheff

+0

Ist Ihnen bekannt, dass das eigentliche Parsen von '" \ xFF "' bereits im C++ Compiler durchgeführt wird? So werden String-Konstanten kompiliert, aber nichts mit 'QByteArray'. Wenn Sie auf 'mainArray [0]' zugreifen, erhalten Sie '255' (oder als hex' 0xFF'). – Scheff

+0

Ich habe mainArray [0] (und 1 und 2 ..) versucht, aber diese enthalten zufällige Symbole wie ÿ und eine Box mit einem x darin (es wird nicht in den Kommentaren angezeigt). –

Antwort

0

Die \xescape sequence stellt einen hexadezimalen Wert innerhalb Stringliterale und Zeichenliterale. Die beiden Hexadezimalziffern nach \x werden als einzelnes Byte analysiert. Zum Beispiel:

QByteArray foo1 = "\x46\x6f\x6f"; 
QByteArray foo2 = "Foo"; 

Q_ASSERT(foo1 == foo2); // 'foo1' and 'foo2' are equal 

Wenn Sie die hexadezimal dargestellten Werte in Ihrem mainArray zugreifen möchten, verwenden Sie einfach die QByteArray::at oder die subscript operator wie folgt:

QByteArray mainArray = "\xFF\xFF\x01\x04\x01\x0B\x03\xEC"; 
int num1 = mainArray[0]; // 0xFF 
int num2 = mainArray[1]; // 0xFF 
int num3 = mainArray[2]; // 0x01 
// ... 

Eine Sache im Auge zu behalten, den Werttyp von QByteArray ist char, die ein signierter Typ ist daher die \xFF auf den meisten Systemen werden -1 insead von 255 sein. Um das erwähnte Problem zu beheben, ist hier eine mögliche Lösung:

QByteArray mainArray = "\xFF\xFF\x01\x04\x01\x0B\x03\xEC"; 
int num1 = 0xff & mainArray[0]; 
int num2 = 0xff & mainArray[1]; 
int num3 = 0xff & mainArray[2]; 
// ... 
+0

'int num1 = mainArray [0];' verursacht ein Problem (wie in einem meiner Kommentare erwähnt). Es liefert nicht "0xFF", sondern "0xFFFFFFFF" (angenommen 32 Bit "int" und "char", die standardmäßig signiert sind) aufgrund der Zeichenerweiterung (obwohl es bei Compilern funktionieren könnte, bei denen "char" standardmäßig vorzeichenlos ist). Ich habe auch in einem anderen Kommentar erwähnt, wie ich es beheben kann. – Scheff

+0

@Scheff, danke für deine Bemerkung, ich habe meine Antwort erweitert. – Akira