QByteArray转换为整数

14

正如您从标题中所了解的,我在将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_size 的值为0x2500(或者采用另一种字节序 - 0x0025)。
问题出在哪里? 我非常确定q_size 保存了我需要的数据。
8个回答

30

这样的代码应该可以工作,使用数据流从缓冲区读取:

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

我已经给了你的答案一个+1。只是想添加一个例子。 - Ropez
13
如果您是从谷歌搜索而来,需要将小端数组转换,请使用 ds.setByteOrder(QDataStream::LittleEndian) - CraftedCart

10

toInt 方法可以解析包含数字字符串的 QByteArray 为整数。如果你想将原始比特位解释为整数,则可能没有直接的方法可以使用,因此你需要自己从单个字节中构建该值。以下代码可能会有所帮助:

int size = (static_cast<unsigned int>(q_size[0]) & 0xFF) << 8
         + (static_cast<unsigned int>(q_size[1]) & 0xFF);
< p >(或根据字节序相反)< /p >

有没有更简单的方法?如果我不仅为WORDs,而且为DWORDs、QWORDs、浮点数等做这个工作,那就需要相当多的工作了... - liliumdev
哦,你是说 QByteArray.to<numberType> 函数只适用于数据为字符串的情况。我有原始二进制数据,一直在苦苦思索为什么它不起作用。谢谢,文档中并没有明确说明这一点,但回过头来想想,这很合理,因为它使用完全相同的参数,并且与 strtol 函数族的工作方式相同。我真傻。 - yano

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

适合我使用。

1
这个方案在 int 小于 4 字节时可行,但如果你想要像数组一样的 int 流,则不能使用此方案。 - Mr. Developerdude

8
我自己还没有尝试过这个方法,不过从Qt文档上看,你可能需要一个 QDataStream。它支持提取所有基本的 C++ 类型,并且可以以 QByteArray 作为输入创建。

这个答案和下一个答案构成了完整的答案。 - kikeenrique

1

我在将串行数据(QByteArray)转换为整数时遇到了很大的问题,因为这个整数是用作进度条的值,但我用一种非常简单的方法解决了它:

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

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,从索引 1 到 4 是整数数组。


0
创建一个操作您的 QByteArray 的 QDataStream。文档在这里

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接