在网络数据流接收为QByteArray时,这里假设为QByteArray data;一般在数据包里有数据包的长度,这里假设这个长度是两个字节,当我们从data取出这两个字节时仍为QByteArray;我是这样获取的:
QByteArray twoBytes=data.mid(开始下标,2);
然后我调用toInt,结果返回都是0;
调试设置断点查看twoBytes的值,大小是2,值是不可见的乱码,twoBytes[0]=0x05; twoBytes[1]=0xa8;这里假设长度是1448,即系十六进制0x05a8。最后查看了toInt的说明文档和里面的例子才知道,05a8在QByteArray里占了四字节时才可以正确转换,即系0x30,0x35,0x61,0x38。
QByteArray str("05a8");//0x30,0x35,0x61,0x38
bool ok;
int hex=str.toInt(&ok,16); //hex==1448,ok==true
int dec=str.toInt(&ok,10); //dec==0,ok==false,because in dec no “a”
如果想要返回ok为真,可以把a变为0
QByteArray str("0508");//0x30,0x35,0x30,0x38
bool ok;
int hex=str.toInt(&ok,16); //hex==1288,ok==true
int dec=str.toInt(&ok,10); //dec==508,ok==true
最后在网上查了一下,找到了文章,虽然代码不正确,但有了思路就好弄了。
思路就是从twoBytes从一个字节一个字节的左取到右然后在rtp_length中由高到低放置,大概实现如下:(可以封装成函数 int BytesToInt(QByteArray towBytes))
for (int i=0;i<twoBytes.length();i++)
{
rtp_length |=(twoBytes[i] & 0x000000FF);
rtp_length=rtp_length << 8;
}
rtp_length=rtp_length>>8;