2017-09-21 4 views
2

Ich bin mit einem Problem in Python konfrontiert und ich glaube, ich verstehe nicht, wie signierte Zahlen in Python behandelt werden. Meine Logik funktioniert in Java, wo alles signiert ist, also brauchen Sie Hilfe in Python.Konvertieren von Bytes in vorzeichenbehaftete Zahlen in Python

Ich habe einige Bytes, die in HEX codiert sind und ich muss sie entschlüsseln und sie zu Zahlen interpretieren. Das Protokoll ist definiert.

Sagen Sie die Eingabe wie folgt aussehen kann:
raw ‚016402570389FFCF008F1205DB2206CA‘ = Und ich so dekodieren:

bin_bytes = binascii.a2b_hex(raw) 
lsb = bin_bytes[5] & 0xff 
msb = bin_bytes[6] << 8 
aNumber = int(lsb | msb) 
print("  X: " + str(aNumber/4000.0)) 

von 4000,0 Nach dem Teilen, X in einem Bereich von -,000025 bis +0,25 sein kann.

Diese Logik funktioniert, wenn X im positiven Bereich ist. Wenn X negativ ist, bekomme ich eine positive Zahl zurück. Ich denke, dass ich "msb" nicht richtig handhabe, wenn es eine vorzeichenbehaftete Nummer ist. Wie handhabe ich handle negative vorzeichenbehaftete Nummer in Python?

Alle Tipps sehr geschätzt.

+0

Sie können dazu das [struct module] (https://docs.python.org/3.6/library/struct.html) verwenden: mit der Funktion entpacken. –

+1

Mögliches Duplikat von [Konvertiert ein Array variabler Größe in eine Ganzzahl/Länge] (https://stackoverflow.com/questions/25259947/convert-variable-sized-byte-array-to-a-integer-long) –

+0

auch vielleicht https://stackoverflow.com/questions/1887506/convert-python-byte-to-unsigned8-bit-integer –

Antwort

0

Sie können Pythons struct module verwenden, um die Bytezeichenfolge in Ganzzahlen zu konvertieren. Es kümmert sich um Endianness und Zeichenerweiterung für Sie. Ich schätze, Sie versuchen, diese 16-Byte-Zeichenfolge als 8 2-Byte-Ganzzahlen mit Vorzeichen in Big-Endian-Byte-Reihenfolge zu interpretieren. Der Formatstring dafür ist '>8h. Das > Zeichen teilt Python mit, die Zeichenfolge als Big Endian zu interpretieren, 8 bedeutet 8 des folgenden Datentyps und h bedeutet signed short Ganzzahlen.

import struct 
nums = struct.unpack('>8h', bin_bytes) 

Jetzt nums ist ein Tupel von ganzen Zahlen, die Sie weiter bearbeiten können.

Ich bin nicht ganz sicher, ob Ihre Daten kleine oder große Endian sind. Wenn es Little-Endian ist, können Sie < verwenden, um dies in der struct.unpack Format-Zeichenfolge anzugeben.

Verwandte Themen