2009-08-09 8 views
6

Wie Sie vielleicht aus dem Titel herausgefunden haben, habe ich Probleme, eine QByteArray in eine ganze Zahl zu konvertieren.QByteArray zu Integer

QByteArray buffer = server->read(8192); 
QByteArray q_size = buffer.mid(0, 2); 
int size = q_size.toInt(); 

jedoch size ist 0. Die buffer keine ASCII-Zeichen erhalten und ich glaube, die toInt() Funktion funktioniert nicht, wenn es nicht ein ASCII-Zeichen ist. Die int size sollte 37 (0x25), aber - wie gesagt - es ist 0.

Die q_size ist 0x2500 (oder die andere endianness Ordnung - 0x0025).

Was ist das Problem hier? Ich bin mir ziemlich sicher, q_size enthält die Daten, die ich brauche.

Antwort

8

Ich habe das selbst nicht versucht, um zu sehen, ob es funktioniert, aber es sieht aus der Qt-Dokumentation, wie Sie möchte einen QDataStream. Dies unterstützt das Extrahieren aller grundlegenden C++ - Typen und kann mit einem QByteArray als Eingabe erstellt werden.

+0

Diese Antwort und [nächste Antwort] (http://stackoverflow.com/a/ 1261927/721929) entsprechen der vollständigen Antwort. – kikeenrique

5

Die Methode toInt analysiert ein int, wenn QByteArray eine Zeichenfolge mit Ziffern enthält. Sie möchten die Rohbits als Ganzzahl interpretieren. Ich glaube nicht, dass es eine Methode dafür in QByteArray gibt, also musst du den Wert selbst aus den Singlebytes konstruieren. Wahrscheinlich so etwas wie dies funktioniert:

int size = (static_cast<unsigned int>(q_size[0]) & 0xFF) << 8 
     + (static_cast<unsigned int>(q_size[1]) & 0xFF); 

(Oder umgekehrt, je nach Endianness)

+0

Es gibt keinen einfacheren Weg? Es würde ziemlich viel Arbeit erfordern, wenn ich dies nicht nur für WORDs tun würde, sondern auch für DWORDs, QWORDs, Floats und so weiter ... – Ahmed

18

So etwas sollte arbeiten, um einen Datenstrom unter Verwendung von aus dem Puffer zu lesen:

QDataStream ds(buffer); 
short size; // Since the size you're trying to read appears to be 2 bytes 
ds >> size; 

// You can continue reading more data from the stream here 
+0

Hmm, klingt vertraut :) – Troubadour

+0

Ich gab bereits Ihre Antwort ein +1. Ich wollte nur ein Beispiel hinzufügen. – Ropez

+4

Thought sollte ich erwähnen für diejenigen, die hier von Google kommen - Wenn Sie ein kleines Endian-Array konvertieren müssen, verwenden Sie 'ds.setByteOrder (QDataStream :: LittleEndian)' – CraftedCart

0

Dies funktioniert für mich:

QByteArray array2; 
     array2.reserve(4); 
     array2[0] = data[1]; 
     array2[1] = data[2]; 
     array2[2] = data[3]; 
     array2[3] = data[4]; 

     memcpy(&blockSize, array2, sizeof(int)); 

data ist ein QByteArray, aus dem Index = 1 bis 4 sind Array-Integer.

0

Erstellen Sie einen QDataStream, der auf Ihrem QByteArray ausgeführt wird. Die Dokumentation ist here

0
bool ok; 
q_size.toHex().toInt(&ok, 16); 

Werke für mich

+0

Dies funktioniert, wenn int kleiner als 4 Bytes ist. aber es wird nicht funktionieren, wenn Sie einen Strom von Ints wie ein Array wollen. –

1

Ich hatte große Probleme in seriellen Daten (QByteArray) Umwandlung in Ganzzahl, die für ein Progress Bar als Wert verwendet werden, gemeint war, sondern löste es auf eine sehr einfache Art und Weise:

QByteArray data = serial->readall(); 
QString data2 = tr(data); //converted the byte array to a string 
ui->QProgressBar->setValue(data2.toUInt()); //converted the string to an unmarked integer..