QByteArray輸出不正常

今天早晨在填充協議頭是使用瞭如下代碼:

QByteArraytempArray;


tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);

tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);

tempArray.push_back((unsignedchar)0xeb);

tempArray.push_back((unsignedchar)0x90);


然後想將其在控制檯輸出,來顯示該幀是否正確填充,卻看到本應輸出0xeb的地方卻輸出了0xffffffeb。這個問題困擾了我幾個小時,還以爲是填進去的數據在QT裏什麼機制下變成了錯誤數據。後來發現將eb或者90換成0x710x60時數據能正確顯示。經比較好現原來

0xeb,0x90都是超過了127的數。而0x710x60都是沒有超過127的數。也就是說我填進去的本應是無符號的數。而QByteArray將其原樣填進去後,在輸出時其前面是一個1,所以將它之前的數也輸出來了,有點類型於TCP粘包的樣子,所以前面帶了ffffff

將輸出代碼改爲:

for (inti = 0; i <data.length();i++)

{

printf("%4x",data.at(i)&0xff);

}


就能正常顯示0xeb了。


還有另外一種比較簡單的方法,那就是在大於127的前面加上unsigned char 對其進行轉化,這樣子也可以正常顯示0xeb.

總結,對有符號數來說最高位爲0表示正數,最就位爲1表示負數。而對無符號數來說就沒有符號位與非符號位了。QByteArray在輸出其一位數時如果不加上0xff,其結果就有可以數組越界。


這個問題在網絡編程中如果不注意也會影響一個程序的流程,比如在做協義配對的時候,如果接到的數據大於0x7f的時候會出現越界的情況。也可以通過已上兩種方式來解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章