QByteArray作爲Qt中字節類型的的類,經常被用於Socket通信傳輸數據,而TCP通信經常發送自定義類型的消息頭和消息體,因此需要將讀取的QByteArray轉換成相應的格式進行處理。
QByteArray自定義的類型轉換函數
- toInt(bool,int)
可轉換爲 2~36進制的數。若int參數爲0,則使用以下規則:如果byte array以0x爲頭,則轉換爲16進制,以0爲頭 則轉換爲八進制。其它轉換爲十進制。 - toHex
轉換爲16進制 - 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的子類,方便用於接受和發送數據,並通過加入常用的成員函數,可以方便使用。