无法以无符号长移位十六进制数据

问题描述 投票:0回答:1

我正在尝试将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。请我需要一些建议

embedded bit-shift ieee-754 shift unsigned-long-long-int
1个回答
0
投票
((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进行预屏蔽,但这不会对任何内容造成伤害
© www.soinside.com 2019 - 2024. All rights reserved.