Seite 1 von 1

Re: Convert to a signed 8 Bit Value ???

Verfasst: Sonntag 17. März 2019, 13:55
von DeaD_EyE
Antwort steht hier bereits: viewtopic.php?f=1&t=45186#p342848
Das erklärt auch, die Formel. Die 256 stechen ins Auge. Ich lasse meine falsche Interpretation trotzdem mal stehen.

Richtig wäre:
K = High byte
L = Low byte
Endianess = Big Endian

ich hätte als Berechnung eher das erwartet:
K << 8 | L
ist aber das gleiche wie
K * 256 + L

__deets__ hat es richtig interpretiert, es handelt sich nicht um zwei Zahlen, sondern um einen signed short, big endian.
-------------------------------

K ist ein signed byte
L ist ein unsigned byte
Die Bytereihenfolge ist bei bytes belanglos.

Die Funktion zum Berechnen:

Code: Alles auswählen

def calc(hex_string):
    data = hex_string.replace(' ', '')[5:9] # Leerzeichen entfernen, Bereich auswählen
    k, l = struct.unpack('bB', binascii.a2b_hex(data)) # hex-string -> bytes -> integer 
    return (k * 256 + l) / 10
Wenn das dein String ist: "7EC21 FF C7 0F B8 10 0E 0E",
musst du zuerst die Leerzeichen entfernen, sonst wirft binascii.a2b_hex einen ValueError.
Die Funktion a2b_hex wandelt den bearbeiteten hex-string in bytes um.
Die Funktion struct.unpack wird verwendet, um C-Datentypen aus Bytes zu interpretieren.
Zuerst wird ein signed byte erwartet und direkt danach ein unsigned byte.

Der Unterschied ist, dass ein signed byte Werte von -128 bis +127 annehmen kann.
Ein unsigned byte von 0 bis 255.

Das könnte auch als Anhaltspunkt dienen, um die Formel etwas besser zu verstehen.

z.B. ergibt -128 * 256 == -32768 == -2**15
Ich vermute mal, dass der Faktor K einen größeren Wertebereich abbilden soll, die Genauigkeit aber nicht so wichtig ist. L ist nur ein Offset. Der Teiler 10 kommt z.B. vor, wenn es sich um eine logarithmische Einheiten wie z.B. dBV oder nur um das logarithmische Verhältnis dB handelt.