QByteArray轉換爲任意格式/結構體

QByteArray作爲Qt中字節類型的的類,經常被用於Socket通信傳輸數據,而TCP通信經常發送自定義類型的消息頭和消息體,因此需要將讀取的QByteArray轉換成相應的格式進行處理。

QByteArray自定義的類型轉換函數

  1. toInt(bool,int)
    可轉換爲 2~36進制的數。若int參數爲0,則使用以下規則:如果byte array以0x爲頭,則轉換爲16進制,以0爲頭 則轉換爲八進制。其它轉換爲十進制。
  2. toHex
    轉換爲16進制
  3. data() 以及 data() const
    返回 char類型的指針,後者返回const char類型指針,指向QByteArray的數據。後者對於只讀,Qt做了一些優化,速度更快。可以使用將char*指針轉換爲其它格式的指針從而將QByteArray轉換爲任意格式的結構體

靈活的大端小端轉換爲int

  • 使用at()方法和位運算實現大端小端轉換。
    小端存儲
//將以4byte char存儲的int數據轉換出來
QByteArray &str; //已輸入數據的QByteArray
int a = 0; //存儲int
a = (str.at(0)) & 0x000000FF;
a = (str.at(1)) & 0x0000FF00;
a = (str.at(2)) & 0x00FF0000;
a = (str.at(3)) & 0xFF000000;
qDebug() << a;  //輸出

大端存儲

//將以4byte char存儲的int數據轉換出來
QByteArray &str; //已輸入數據的QByteArray
int a = 0; //存儲int
a = (str.at(0)) & 0x000000FF;
a = (str.at(1)) & 0x0000FF00;
a = (str.at(2)) & 0x00FF0000;
a = (str.at(3)) & 0xFF000000;
qDebug() << a;  //輸出

轉換成自定義類型的結構體

例如TCP的自定義消息頭定義如下:

typedef struct{
	int send_id;
	int recv_id;
	int len;
	int check_sum;
}Msg;

則通過指針類型轉換可以訪問固定格式的數據。
例如

QByteArray &str;//讀取的數據
Msg *msg = (Msg*)str.data();
qDebug() msg->len;

old 警告

使用reinterpret_cast對char*進行轉換,轉換爲自定義的結構體指針。(應做安全措施,檢驗長度)

DispCtrlMsg temp_msg = reinterpret_cast<DispCtrlMsg>(msg_head.data());

進階:定義QByteArray的子類

爲Socket通信自定義一個QByteArray的子類,方便用於接受和發送數據,並通過加入常用的成員函數,可以方便使用。

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