2017-04-27 3 views
0

私は実際に温度センサーから値(b'\xc8\x00')を取得します。私はそれを浮動小数点値に変換したいと思います。それは正しいです、私はそれを解読する必要がありますか?ここでb ' xc8 x00'をフロートに変換するには?

は私の関数である。

def ToFloat(data): 
    s = data.decode('utf-8') 
    print(s) 
    return s 

しかし、私はそれをコンパイルしようとすると、私はエラーを取得する:

'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte 
+3

最終的にどの程度の温度が期待されますか? 2文字を数字に変換する方法は100万種類あります。温度計がオーブンやリビングルーム、南極大陸にあるかどうかを知っていれば、それを絞り込むのに役立ちます。 – Kevin

+0

コンパイル? Pythonで? str.decodeは何をすべきだと思いますか?浮動小数点数に変換しようとしている文字列は何ですか? –

+1

'b '\ xc8 \ x00''はどのfloat値を表しますか?どのような浮動小数点表現ですか?これは少なくとも4バイトのデータを必要とする一般的なIEEEフォーマットではないため、2バイトでは不十分です。その表現を知っているなら、 'struct'モジュールは使うべきものと思われます。 – martineau

答えて

2

あなたがパックされたバイトではないユニコードオブジェクトを持っているようです。 struct.unpackを使用します。

In [3]: import struct 
In [4]: struct.unpack('h', b'\xc8\x00')[0] 
Out[4]: 200 

フォーマットhは短い値(2バイト)を指定します。あなたの温度の値は常に正となります場合は、符号なしの短いためHを使用することができます。それはfloatを返しますが、整数値としてデータをinterpretesとしてToFloat()は少し刺激性であることを

import struct 

def to_float(data): 
    return float(struct.unpack('H', data)[0]) 
0

注意してください。バイトが浮動小数点を表す場合、浮動小数点がこれらの2バイトにどのようなフォーマットでパックされているかを知る必要があります(通常floatは2バイトを超えます)。

data = b'\xc8\x00' 
def ToFloat(data): 
    byte0 = int(data[0]) 
    print(byte0) 
    byte1 = int(data[1]) 
    print(byte1) 
    number = byte0 + 256*byte1 
    print(number) 
    return float(number)  

リターン:200.0合理的であると思われるもの。そうでない場合は、データが意味するものを見てそれに応じて処理してください。

関連する問題