2017-04-27 1 views
0

Ich bekomme tatsächlich einen Wert (b'\xc8\x00') von einem Temperatursensor. Ich möchte es in einen Gleitkommawert konvertieren. Ist es richtig, dass ich es entschlüsseln muss?Wie konvertiert man b ' xc8 x00' in float?

Hier ist meine Funktion:

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

Aber wenn ich versuche, es zu kompilieren, erhalte ich die Fehlermeldung:

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

Bei welcher Temperatur erwarten Sie ungefähr, dass der Wert am Ende ist? Es gibt eine Million Möglichkeiten, zwei Zeichen in eine Zahl umzuwandeln, und es würde helfen, es einzugrenzen, wenn wir wüssten, ob sich Ihr Thermometer in einem Ofen oder in Ihrem Wohnzimmer oder in der Antarktis befindet. – Kevin

+0

Kompilieren? In Python? Was denkst du, was str.decode machen soll? Was ist die Zeichenfolge, die Sie scheinbar in einen Float zu konvertieren versuchen? –

+1

Welchen Float-Wert repräsentiert 'b '\ xc8 \ x00''? Was für eine Gleitkommadarstellung ist das? Es ist kein gewöhnliches IEEE-Format, das mindestens 4 Bytes an Daten benötigt, also sind nur zwei Bytes nicht genug. Wenn Sie die Repräsentation kennen, dann scheint das 'struct'-Modul das zu verwenden. – martineau

Antwort

2

Sie scheinen gepackten Bytes nicht Unicode-Objekte werden zu müssen. Verwenden struct.unpack:

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

h Format spezifiziert einen kurzen Wert (2 Bytes). Wenn Ihre Temperaturwerte immer positiv sein wird, können Sie H für unsigned short verwenden:

import struct 

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

Beachten Sie, dass ToFloat() ein wenig irritierend ist, wie es einen Schwimmer gibt aber interpretiert die Daten als Integer-Werte. Wenn die Bytes einen Float darstellen, wäre es notwendig zu wissen, in welchem ​​Format der Float in diese zwei Bytes gepackt wird (normalerweise dauert float mehr als zwei Bytes).

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)  

kehrt: 200,0 was scheint vernünftig zu sein. Wenn nicht, sehen Sie einfach, was die Daten bedeuten und verarbeiten Sie entsprechend.

Verwandte Themen