将QByteArray转换为quint16

3

我有一个来自libpurple的C宏:

#define yahoo_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff))

如何编写一个函数,该函数将以QByteArray作为参数,并使用上面C宏中的算法返回quint16值?
我曾经提出过一个类似的问题,将quint16转换为QByteArray,请参考此处,所以现在我正在尝试执行该函数的反向操作。
谢谢。
3个回答

6

You can also use qFromBigEndian

QByteArray bytes;
...
quint16 result = qFromBigEndian<quint16>((uchar*)bytes.data());

4
我建议你按照以下方式进行尝试(即让QDataStream为你完成工作,它可以使用QByteArray构造,我们称之为yourByteArray):
QDataStream dataStream(yourByteArray);
quint16 foo;
dataStream >> foo;

我希望这能有所帮助。
编辑:这个问题看起来与此问题有些相关。

除了这个不起作用。如果你看一下我发的链接,你会发现quint16转换成QByteArray时,位被移动到类似QByteArray[0]将拥有quint16的最后8位,而QBytearray[1]将拥有quint16的前8位。 - daniels
1
@daniels:看一下http://doc.trolltech.com/4.7/qdatastream.html#setByteOrder,你可以设置`QDataStream`的字节顺序/字节序。 - Greg S
没错,就是这样,setByteOrder 做得很好。我还重写了我发布的链接中的函数,使用了 QDataStream。谢谢。 - daniels

2

Greg S的代码对我来说很好用(Qt 4.6.2和WinXP)。quint16的最低有效位来自QByteArray [1],而最高有效位来自QByteArray [0]。但是如果您想要完全控制quint16的构建方式,请获取字节数组的两个字节,并从中构建quint16:

QDataStream dataStream(yourByteArray);
quint8 byte0;
quint8 byte1;
dataStream >> byte0 >> byte1;
quint16 result = (byte0 << 8) + byte1;

我已经接受了Greg S的答案,因为使用QDataStream似乎更加优雅。起初它对我没有起作用,因为我没有为数据流设置字节顺序/字节序。感谢您的回答,它也是正确的,但不幸的是我只能接受一个答案。已点赞。 - daniels

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