2009-08-09 334 views
6

正如您可能已经从标题中想出的,我在将QByteArray转换为整数时遇到问题。QByteArray为整数

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

然而,size是0。buffer没有收到任何ASCII字符,我相信,如果它不是一个ASCII字符的toInt()功能将无法正常工作。该int size应该是37(0x25),但 - 正如我已经说过 - 这是0.

q_size0x2500(或其他字节顺序顺序 - 0x0025)。

这里有什么问题?我很确定q_size拥有我需要的数据。

回答

8

我没有尝试这样做我自己,看看它的工作原理,但它从Qt的文档就像你看起来想要一个QDataStream。这支持提取所有基本的C++类型,并可以使用QByteArray作为输入来创建。

+0

This answer and [next answer](http://stackoverflow.com/a/ 1261927/721929)符合完整的答案。 – kikeenrique 2017-03-01 11:06:36

5

如果QByteArray包含带数字的字符串,则toInt方法会解析int。你想把原始位解释为一个整数。我不认为QByteArray中有这样的方法,所以你必须从歌曲字节中自己构造这个值。也许这样的事情会工作:

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

(或其他方式,这取决于字节序)

+0

有没有简单的方法?如果我不仅需要WORD,而且还需要DWORD,QWORD,浮动等等,这将需要很多工作... – Ahmed 2009-08-09 17:01:39

18

像这样的东西应该工作,使用数据流从缓冲区读取:

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

嗯,听起来很熟悉:) – Troubadour 2009-08-11 20:52:34

+0

我已经给你的答案+1。只是想添加一个例子。 – Ropez 2009-08-12 18:59:34

+4

想到我应该提到那些来自Google的人 - 如果您需要转换一个小端序列,请使用'ds.setByteOrder(QDataStream :: LittleEndian)' – CraftedCart 2017-06-03 17:40:16

0

这个工作对我来说:

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是一个QByteArray中,从index = 1〜4是数组整数。

0

创建一个运行在你的QByteArray上的QDataStream。文档是here

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

作品对我来说

+0

这适用于int小于4个字节的情况。但是如果你想要一个像数组这样的整数流,它将不起作用。 – 2017-08-18 06:39:11

1

我将串行数据转换(QByteArray)到整数,本来是用作Progress Bar值有很大的问题,但解决它的一个非常简单的方法:

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