2016-12-14 25 views
0

私のデータロガープロジェクトでは、データをSDカードに記録しています。ここではデータをバイナリ形式で保存します。私は加速度計と温度&湿度センサーを記録しています。バイトごとにデータを読み取ることができました。したがって、ADXLデータ(2バイト)を印刷するために、2バイトのデータをそれぞれ結合します。したがって、温度データを得るために4バイトを結合しなければならない。残念ながら私は実際のデータを印刷できませんでした。変換に問題があります。私は浮動小数点にデータを変換する方法に関するいくつかの助けを探しています。バイナリデータを浮動小数点値に変換する方法は?

(加速度データ)をuint16_tするバイナリを読み、印刷するためのコード:(temparatureデータ)をfloat型にバイナリを読み、印刷する作業

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からの1バイトの生データは、24,58,46,66であり、可変ハムからの出力は、406466112.000000である。

フリーダで湿度や温度(フロート)を読み取ることができました。不幸にもfreadを使用するには、ファイルに格納されているバイト数を知る必要があります。 以下のコードでは、フロートも印刷できます。 INTメイン(){

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); 

}

Iのような変換式を知りたい(acc_con [1] < < 8)| acc_con [0]。ありがとうございました。

+2

[** 'struct' **](https://docs.python.org/3/library/struct.html) –

+1

を参照してください。これはPythonまたはCの質問ですか? – cdarke

+0

これはCです。以下の回答を完了してください。 – Gandhi

答えて

1

あなたはPythonでこれを実行したい場合は、それはstructモジュールのための仕事のように聞こえる:

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

これは、リトルエンディアンバイト順を想定しています。 Cでは

、あなたはmemcpy()を使用することができます。

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

その働き。それはCです。ありがとうございます。 – Gandhi

0

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

を使用すると、32ビットの整数データに8ビットのデータを変換しています。このデータは直接保存することができます。または、あなたが絶対にフロートに保管したい場合は、使用することができます。

float hum_f; 
.... 
hum_f = hum; 
0

Yapは単純な関数ではなく、バイトの配列を浮動小数点関数に変換します。私は携帯の理由を避けるためにそれを実装するためにも見ています。リトルエンディアンマシンとビッグエンディアンマシンの違いもあります。 しかし、この問題にはいくつかのハックがあります。 最初にファイルサイズ、 "sys/stat.h"をインクルードする必要があります。小さな違いもあります。しかし、必須ではありません。 文字のバッファとしてそれを読む:

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

Cは、それらのもののために素晴らしいです、everithingをキャストする必要もありません。

関連する問題