在網絡數據流接收為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;