2009-08-09 8 views
6

Como puede haber deducido del título, tengo problemas para convertir un QByteArray en un número entero.QByteArray a entero

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

Sin embargo, size es 0. El buffer no recibe ningún tipo de caracteres ASCII y creo que la función toInt() no funcionará si no es un carácter ASCII. El int size debería ser 37 (0x25), pero - como he dicho - es 0.

El q_size es 0x2500 (o el otro orden endianness - 0x0025).

¿Cuál es el problema aquí? Estoy bastante seguro de que q_size contiene los datos que necesito.

Respuesta

8

No he probado esto por mí mismo para ver si funciona pero se ve desde la documentación de Qt como usted quiero un QDataStream. Esto admite la extracción de todos los tipos básicos de C++ y se puede crear con un QByteArray como entrada.

+0

Esta respuesta y [siguiente respuesta] (http://stackoverflow.com/a/ 1261927/721929) conforman la respuesta completa. – kikeenrique

5

El método toInt analiza un int si el QByteArray contiene una cadena con dígitos. Desea interpretar los bits sin formato como un entero. No creo que haya un método para eso en QByteArray, por lo que tendrás que construir el valor tú mismo a partir de los bytes songle. Probablemente algo como esto funcionará:

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

(O al revés, dependiendo de Endianness)

+0

no hay manera más simple? Requeriría bastante trabajo si hiciera esto no solo para WORDs, sino también para DWORD, QWORD, floats, etc. – Ahmed

18

Algo como esto debería funcionar, usando un flujo de datos a leer desde la memoria intermedia:

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, suena familiar :) – Troubadour

+0

Ya di tu respuesta a +1. Solo quería agregar un ejemplo. – Ropez

+4

Pensé que debería mencionar los que vienen de Google. Si necesita convertir una pequeña matriz endian, use 'ds.setByteOrder (QDataStream :: LittleEndian)' – CraftedCart

0

Esto funciona para mí:

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 es un QByteArray, del índice = 1 a 4 son un entero matriz.

0

Cree un QDataStream que opere en su QByteArray. La documentación es here

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

funciona para mí

+0

Esto funciona cuando int es menor que 4 bytes. pero no funcionará si quieres un flujo de entradas como una matriz. –

1

yo tuvimos grandes problemas en la conversión de datos en serie (QByteArray) a un entero que estaba destinado a ser utilizado como el valor de una Progress Bar, pero lo resolvieron de una manera muy sencilla:

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..