如何将二进制数据转换为浮点值?

时间:2016-12-14 09:38:49

标签: c++ c microcontroller

对于我的数据记录器项目,我将数据记录到SD卡。在这里,我以二进制格式存储数据。我记录了加速度计和温度和湿度传感器。我可以逐字节读取数据。因此,为了打印ADXL数据(两个字节),我组合了每两个字节数据。因此,必须组合四个字节来获得温度数据。不幸的是,对于temparature我无法打印实际数据。有一些转换问题。我正在寻找一些关于如何将数据转换为浮点数的帮助。

读取和打印二进制文件到uint16_t(加速度计数据)的代码:工作

while ((nr = fgetc(logFile)) != EOF){
         pc.printf(" \r\n %d ",nr);
          acc_con[i] = nr;
          if (i == 1){ 
          acc = (acc_con[1]<<8) | acc_con[0];
          pc.printf(" \r\n %i ",acc);
          i = 0;} 
          else i++; 
         }

读取和打印二进制到浮点数的代码(温度数据):不工作

while ((nr = fgetc(logFile)) != EOF){
         pc.printf(" \r\n %d ",nr);
           humicon[i] = nr;
           if (i == 3){
            hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];
            pc.printf(" \r\n %f ",hum);
            i = 0;}
            else i++;
            }

来自变量nr的逐字节原始数据是:24,58,46,66,变量hum的输出是:406466112.000000。

我可以通过fread读取湿度或温度(浮子)。不幸地使用fread我必须知道存储在文件中的字节数。 使用下面的代码我也可以打印浮点数。      int main(){

int nr;
FILE *fp = fopen("/sd/PCE000.bin", "rb");
float read[1];
fread(read,sizeof(float),1,fp);
pc.printf("\r\n %f",read[0]);
  fclose(fp); 

}

我想知道转换的公式,如(acc_con [1]&lt;&lt; 8)| acc_con [0]。谢谢。

3 个答案:

答案 0 :(得分:1)

如果你想在Python中这样做,这听起来像是struct模块的工作:

>>> struct.unpack("f", "".join([chr(x) for x in [24, 58, 46, 66]]))
(43.556732177734375,)

这假定为little-endian字节顺序。

在C中,您可以使用memcpy()

float x;
const unsigned char bytes[] = { 24, 58, 46, 66 };
memcpy(&x, bytes, sizeof x);
printf("%f\n", x);

答案 1 :(得分:0)

unsigned int hum;
....
hum = (humicon[0] << 24) | (humicon[1] << 16) | (humicon[2] << 8) | humicon[3];

您正在将8位数据转换为32位整数数据。您可以直接存储此数据。或者,如果您绝对想要存储在浮动中,则可以使用。

float hum_f;
....
hum_f = hum;

答案 2 :(得分:0)

Yap,不是简单的函数,将字节数组转换为浮点函数。我也希望实现它以避免便携性的原因。小端和大端机之间也存在差异。 但是这个问题有几个问题。 首先是文件大小,你必须包括&#34; sys / stat.h&#34;,小差异也是可移植的。但不是必需的。 读它作为char的缓冲区:

char f[sizeof(float)];
if (fread(f,1,sizeof(float), yourfile) ==sizeof(float))
{
    float *flt_ptr=f;
    printf("%f\n",*flt_ptr);
}
对于那些事情来说,C是很棒的,也没有必要施展永恒。