我正在尝试将IEEE 754浮点表示形式转换为其等效的十进制形式,所以我有一个示例数据[7E FF 01 46 4B CD CC CC CC CC CC 10 40 1B 7E],该数据位于hex中。
char strResponseData[STATUS_BUFFERSIZE]={0};
unsigned long strData = (((strResponseData[12] & 0xFF)<< 512 ) |((strResponseData[11] & 0xFF) << 256) |((strResponseData[10] & 0xFF)<< 128 ) |((strResponseData[9] & 0xFF)<< 64) |((strResponseData[8] & 0xFF)<< 32 ) |((strResponseData[7]& 0xFF) << 16) |((strResponseData[6] & 0xFF )<< 8) |(strResponseData[5] & 0xFF));
value = IEEEHexToDec(strData,1);
然后我将此值传递给此函数
IEEEHexToDec(unsigned long number, int isDoublePrecision)
{
int mantissaShift = isDoublePrecision ? 52 : 23;
unsigned long exponentMask = isDoublePrecision ? 0x7FF0000000000000 : 0x7f800000;
int bias = isDoublePrecision ? 1023 : 127;
int signShift = isDoublePrecision ? 63 : 31;
int sign = (number >> signShift) & 0x01;
int exponent = ((number & exponentMask) >> mantissaShift) - bias;
int power = -1;
double total = 0.0;
for ( int i = 0; i < mantissaShift; i++ )
{
int calc = (number >> (mantissaShift-i-1)) & 0x01;
total += calc * pow(2.0, power);
power--;
}
double value = (sign ? -1 : 1) * pow(2.0, exponent) * (total + 1.0);
return value;
}
但作为回报,它的值为0,当试图打印strData时,它也只给我CCCCCD。我正在使用Eclipse IDE。请我需要一些建议
((strResponseData[12] & 0xFF)<< 512 )
首先,<<
运算符需要移位许多位,您似乎将它与乘以2的乘方幂相混淆-尽管它具有相同的作用,但您需要提供指数。鉴于您没有512位宽的典型数据类型,因此可以肯定的是。
((strResponseData[12] & 0xFF)<< 9 )
下一步,必须将值移位为足够的类型以保存结果之前进行移位。 char
显然不够,因此您需要将值显式转换为足够的类型,以保存结果[[执行移位之前]。[另外(尤其是在嵌入式领域中,请记住,unsigned long
可能是32位或64位类型,取决于您的平台,因此,如果您进行移位操作而结果不会适合32位,您可能需要unsigned long long
或更佳的类型,例如uint64_t
此外,char
可以是有符号或无符号类型。在转移之前,您应该明确指出这一点。鉴于您要组合多个事物,因此几乎可以肯定,其中至少
most
应被视为未签名。所以您可能想要类似的东西((uint32_t)(strResponseData[12] & 0xFF)<< 9 )
除非您在char
不是8位(例如某些TI DSP的)的奇怪平台上,您可能不需要使用0xff进行预屏蔽,但这不会对任何内容造成伤害