2009-08-09 31 views
6

Jak można się domyślić z tytułu, mam problemy z konwersją QByteArray na liczbę całkowitą.QByteArray na liczbę całkowitą

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

Jednak size jest 0. buffer nie otrzyma dowolny znak ASCII i wierzę, funkcja toInt() nie będzie działać, jeśli nie jest to znak ASCII. int size powinno być 37 (0x25), ale - jak już powiedziałem - to 0.

q_size jest 0x2500 (lub inna kolejność kolejność bajtów - 0x0025).

Na czym polega problem? Jestem pewien, że q_size przechowuje dane, których potrzebuję.

Odpowiedz

8

nie próbowałem to sobie sprawdzić, czy to działa, ale to wygląda z docs Qt jak ty chcesz QDataStream. Obsługuje on wyodrębnianie wszystkich podstawowych typów C++ i może być utworzony z QByteArray jako dane wejściowe.

+0

Ta odpowiedź i [następna odpowiedź] (http://stackoverflow.com/a/ 1261927/721929) spełnia pełną odpowiedź. – kikeenrique

5

Metoda toInt analizuje wartość int, jeśli QByteArray zawiera ciąg znaków z cyframi. Chcesz interpretować nieprzetworzone bity jako liczbę całkowitą. Nie sądzę, że istnieje taka metoda w QByteArray, więc będziesz musiał sam skonstruować wartość z bajtów utworów. Prawdopodobnie coś jak to będzie działać:

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

(lub na odwrót, w zależności od endianness)

+0

Nie ma prostszego sposobu? Wymagałoby to sporo pracy, gdybym robił to nie tylko dla słów, ale dla DWORD, QWORD, spławik itd. – Ahmed

18

Coś jak to powinno działać, wykorzystując strumień danych do odczytu z bufora:

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, brzmi znajomo :) – Troubadour

+0

Już podałem twoją odpowiedź +1. Chciałem tylko dodać przykład. – Ropez

+4

Myślałem, że powinienem wspomnieć o tych, którzy przychodzą tutaj z Google - jeśli chcesz przekonwertować małą tablicę endian, użyj 'ds.setByteOrder (QDataStream :: LittleEndian)' – CraftedCart

0

Działa to dla mnie:

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 jest qbytearray z indeksu = 1 do 4 są liczbą całkowitą tablicy.

0

Utwórz QDataStream, który działa na Twoim QByteArray. Dokumentacja jest here

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

działa na mnie

+0

Działa to, gdy int jest mniejsze niż 4 bajty. ale to nie zadziała, jeśli chcesz strumień intów jak tablica. –

1

miałem wielkie problemy w konwersji danych szeregowych (QByteArray) do liczby całkowitej, która miała być wykorzystana jako wartość dla Progress Bar, ale rozwiązać go w bardzo prosty sposób:

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.. 
Powiązane problemy