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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server