QByteArray
The QByteArray class provides an array of bytes.
Qt 手冊中描述 QByteArray 為 字節數組 ,即是一個數組,里面保存字節。
在 Qt 中,QByteArray一般用於數據的傳輸,因為經常需要將其他類型的數據轉換成 QByteArray,可以使用它的 append() 方法將字節一個一個的插入到數據中。
方法聲明如下:
QByteArray& append(char ch);
append() 有多個重載,但是只有這個是一個字節一個字節地插入。
整型 <==> QByteArray
以x86平台的int型為例,int占4位,轉換后QByteArray大小應該為4,QByteArray大小決定了存儲的數據的范圍
遍歷 int型 數據的四個字節,將每個字節的數據單獨提取出來
static int andArray[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
QByteArray Int2Byte(int int_data, int bits)
{
QByteArray byte_data;
bits = (bits > 4 || bits <= 0)? 4: bits;//1/2/3/4
for(int index = 0; index < bits; index++)
{
int offset = index * 8;
byte_data.append((char) ((andArray[index] & int_data) >> offset));
}
return byte_data;
}
int Byte2Int(QByteArray bytes)
{
int addr = bytes[0] & 0x000000FF;
addr |= ((bytes[1] << 8) & 0x0000FF00);
addr |= ((bytes[2] << 16) & 0x00FF0000);
addr |= ((bytes[3] << 24) & 0xFF000000);
return addr;
}
說明:
- data & 0x0000FF00 可以保留低二位的數據,清楚其他位數據;
- data >> 4 向右偏移 4 位,新增位置 0,可以將低二位變為低一位;
- a |= b 即 a = a|b,這里偏移之后,將新位置數據合並起來;
- byte 轉 int 和 int 轉 byte 操作相反,並使用 |= 進行數據位拼接;
注意:
在進行轉換的時候需要考慮到低位和高位的問題,示例代碼從 int 數據的低位開始取數,所以 QByteArray 中的數據的第一位是 int 的最低位,關於從低位到高位,還是高位到地位,需要和調用方商量好。
浮點型 <==> QByteArray
以x86平台的float型為例,float占4位,轉換后QByteArray大小應該為4,QByteArray大小決定了存儲的數據的范圍
數據傳輸中,可以將浮點型乘以一定的倍數,轉換成整型傳輸,也可以不乘,這里使用直接轉換的方法
關於浮點數在內存中的存儲方式,請參考相關文章,這里不作詳細描述,總而言之,浮點數和整型數在內存中是相似的,所以只要將浮點數的內存中的內容直接轉換即可
QByteArray Float2Byte(float data)
{
QByteArray byte_data;
char* data_char = (char*)&data;
for(int index = 3; index >= 0; index--)
{
byte_data.append(data_char[index]);
}
return byte_data;
}
float Byte2Float(QByteArray byte)
{
float result = 0;
int size = byte.size();
char* data_char = byte.data();
char* p = (char*)&result;
for(int index = 0; index < size; index++)
{
*(p + index) = *(data_char + size - 1 - index);
}
return result;
}
說明:
- 使用 char* 指針直接指向 float 數據的內存地址,並使用指針取出地址內容;
- 同樣的,反向轉換的時候,還是用指針將數據直接保存進內容中;
注意:
這里仍然要考慮高位和低位的問題,示例代碼 float 轉 QByteArray 中,從高位開始,所以轉換后的QByteArray 的第一位是最高位,關於從低位到高位,還是高位到地位,需要和調用方商量好。
