【问题标题】:how to convert binary data to float value?如何将二进制数据转换为浮点值?
【发布时间】:2016-12-14 09:38:48
【问题描述】:

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

读取二进制文件并将其打印到 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]

【问题讨论】:

  • struct
  • 这是一个 python 还是 C 的问题?
  • 它是 C。按照下面的答案完成。

标签: c++ c microcontroller


【解决方案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);

【讨论】:

    【解决方案2】:

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

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

    float hum_f;
    ....
    hum_f = hum;
    

    【讨论】:

      【解决方案3】:

      是的,不是简单的函数,将字节数组转换为浮点函数。我也在寻找实现它以避免便携的原因。小端和大端机器之间也存在差异。 但是这个问题有几个技巧。 首先是文件大小,你必须包括“sys/stat.h”,小不同也是可移植的。但不是必需的。 将其读取为 char 的缓冲区:

      char f[sizeof(float)];
      if (fread(f,1,sizeof(float), yourfile) ==sizeof(float))
      {
          float *flt_ptr=f;
          printf("%f\n",*flt_ptr);
      }
      

      C 很适合那些东西,也不需要什么都投。

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 2014-11-24
        • 2017-06-24
        • 1970-01-01
        相关资源
        最近更新 更多