整型和浮點型與QByteArray的轉換


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 |= ba = a|b,這里偏移之后,將新位置數據合並起來;
  • byteintintbyte 操作相反,並使用 |= 進行數據位拼接;

注意:

在進行轉換的時候需要考慮到低位和高位的問題,示例代碼從 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 數據的內存地址,並使用指針取出地址內容;
  • 同樣的,反向轉換的時候,還是用指針將數據直接保存進內容中;

注意:

這里仍然要考慮高位和低位的問題,示例代碼 floatQByteArray 中,從高位開始,所以轉換后的QByteArray 的第一位是最高位,關於從低位到高位,還是高位到地位,需要和調用方商量好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM