double CModbus::HexToDouble(const unsigned char* buf)
{
double value = 0;
unsigned int i = 0;
unsigned int num,temp;
int num2;
bool flags1 = true;
num = getbitu(buf,i,1); //标志位
i += 1;
//double型规定偏移量为1023,其表示范围为-1024-1023
num2 = getbitu(buf,i,11) - 1023;
i += 11;
while(1)
{
if(flags1)
{
flags1 = false;
value += 1 * pow(2,num2); num2--;
}
temp = getbitu(buf,i,1); i += 1;
value += temp * pow(2,num2); num2--;
if(i == 64)
break;
}
if(num == 1)
value *= -1;
return value;
}
unsigned int CModbus::getbitu(const unsigned char *buff, int pos, int len)
{
unsigned int bits=0;
int i;
for (i=pos;i<pos+len;i++)
{
bits=(bits<<1)+((buff[i/8]>>(7-i%8))&1u);
}
return bits;
}