天天看點

2位元組十六進制浮點數 qt_Qt之8個位元組轉化為double小數

首先要了解double的存儲方式,具體可查找相關的部落格

本文實作的是将8個位元組(存儲為16進制的字元串)轉化為對應的double類型

double MainWindow::qByteArraytodouble(QString qstr)

{

QByteArray byte;

StringToHex(qstr,byte);

double result;

memcpy(&result, byte.data(), 8);

return result;

}其中StringToHex函數定義如下

void MainWindow::StringToHex(QString str, QByteArray &senddata)

{

int hexdata,lowhexdata;

int hexdatalen = 0;

int len = str.length();

senddata.resize(len/2);

char lstr,hstr;

for(int i=0; i

{

//char lstr,

hstr=str[i].toLatin1();

if(hstr == ' ')

{

i++;

continue;

}

i++;

if(i >= len)

break;

lstr = str[i].toLatin1();

hexdata = ConvertHexChar(hstr);

lowhexdata = ConvertHexChar(lstr);

if((hexdata == 16) || (lowhexdata == 16))

break;

else

hexdata = hexdata*16+lowhexdata;

i++;

senddata[hexdatalen] = (char)hexdata;

hexdatalen++;

}

senddata.resize(hexdatalen);

}

char MainWindow::ConvertHexChar(char ch)

{

if((ch >= '0') && (ch <= '9'))

return ch-0x30;

else if((ch >= 'A') && (ch <= 'F'))

return ch-'A'+10;

else if((ch >= 'a') && (ch <= 'f'))

return ch-'a'+10;

else return ch-ch;//不在0-f範圍内的會發送成0

}同樣的,也可以用類似的方法,将4個位元組轉化為對應的float資料

float MainWindow::qByteArraytofloat(QString qstr)

{

QByteArray byte;

StringToHex(qstr,byte);

float result;

memcpy(&result, byte.data(), 4);

return result;

}調用執行個體如下:

QString longitude = list[4];//"d0e1219827610040"

double longitude_rad = qByteArraytodouble(longitude);//2.04744

double longitude_deg = 180 * longitude_rad /M_PI;

longitude = QString::number(longitude_deg,10,8) + " deg";

ui->label_longitude->setText(longitude);

QString altitude = list[5];//"55fc6a40"

float altitude_m = qByteArraytofloat(altitude);//3.67165

altitude = QString::number(altitude_m,10,8) + " deg";

ui->label_altitude->setText(altitude);

标簽: