4byte数组转换为float(c)

时间:2016-11-11 11:48:37

标签: c arrays type-conversion

void OPC_N2_data_read()
{
    unsigned int32 iobyte[3][4] = {0x00, };
    int32 PM_int[3] = {0x00, };
    float PM[3] = {0x00, };

    int8 i,j,k;
    int8 mask = 0x80;
    const int16 mask1 = 0x0001;
    const int16 mask0 = 0x0000;
    int8 trash_byte = 0x32;

    output_bit(ss,1);
    output_bit(PM_CLOCK_pin,0);
    delay_us (1);
    output_bit(ss,0);
    delay_us (2);  
    for( i = 0 ; i < 3 ; i ++ )
    {
      for ( j = 0 ; j < 4 ; j ++ )
      {
         for (k = 0 ; k < 8 ; k ++ )
         {
            output_bit(PM_CLOCK_pin,1); 
            iobyte[i][j] = iobyte[i][j] << 1;           
            if ( input ( PM_MISO_pin))
            {
               iobyte[i][j] |= mask1;
            }
            else
            {
               iobyte[i][j] |= mask0;
            }
            if ((trash_byte & mask) >0)
            {
                output_high(PM_MOSI_pin);
            }
            else
            {
               output_bit(PM_MOSI_pin,0);
            }            
            delay_us(1);                             
            output_bit(PM_CLOCK_pin,0);            
            delay_us(5); 
            mask = mask >>1;
         }
      }
   }
   delay_us(3);
   output_high(ss);

   for(i = 0; i<3; i++)
   {
     PM_int[i] = ((iobyte[i][0]<<24)|(iobyte[i][1]<<16)|(iobyte[i][2]<<8)|(iobyte[i][3]));
     PM[i] = *(float*)&PM_int;

   }   
   printf ("%x%x%x%x\r\n",iobyte[0][0],iobyte[0][1],iobyte[0][2],iobyte[0][3]);
   printf ("%x%x%x%x\r\n",iobyte[1][0],iobyte[1][1],iobyte[1][2],iobyte[1][3]);
   printf ("%x%x%x%x\r\n",iobyte[2][0],iobyte[2][1],iobyte[2][2],iobyte[2][3]);
   printf ("%lx,%lx,%lx\r\n", PM_int[0],PM_int[1],PM_int[2]);
   printf ("%3.5f,%3.5f,%3.5f\r\n", PM[0],PM[1],PM[2]);

}

我从4字节数组接收数据。 此数据是浮点值。 我通过电脑查看,我看到以下内容。

e911bd41 d867e641 8084e941 e911bd41,d867e641,8084e941 0.00000,0.00000,0.00000

将四个数据组合成一个INT值可以正常工作。 PM_int[0]PM_int[1]PM_int[2]

但是,如果您尝试将其转换为浮点值,则仅显示0.00000

我不知道问题出在哪里。

1 个答案:

答案 0 :(得分:0)

查看源代码显示,您假设在以big-endian格式排序时,收到的iobyte[i][0]iobyte[i][3]将被假定为浮点数:

PM_int[i] = ((iobyte[i][0]<<24)|(iobyte[i][1]<<16)|(iobyte[i][2]<<8)|(iobyte[i][3]));

但是如果要正确转换32位浮点值,则必须知道源CPU和目标CPU是big-endian还是little-endian。否则,在尝试转换值之前必须反转字节顺序。因此,如果您的目标具有不同的字节序,请使用以下代码替换上述代码:

PM_int[i] = ((iobyte[i][3]<<24)|(iobyte[i][2]<<16)|(iobyte[i][1]<<8)|(iobyte[i][0]));

在源代码中,float PM[i]和32位整数PM_int[i]之间的强制转换格式错误会计算出错误的结果。必须对数组PM_int[i]的good元素执行强制转换。

PM[i] = *((float*)&(PM_int[i]));

而不是:

PM[i] = *(float*)&PM_int;

使用3个接收的浮点值{0xe9, 0x11, 0xbd, 0x41 }, {0xd8, 0x67, 0xe6, 0x41 }, {0x80, 0x84, 0xe9, 0x41 },输出变为:

e911bd41
d867e641
8084e941
41bd11e9,41e667d8,41e98480
23.63375,28.80070,29.18970