Wie kann ich Teil eines Tupels Python (Byte-Array) in eine ganze Zahl konvertiert
Frage
Ich versuche, an ein Gerät mit Python zu sprechen. Ich habe ein Tupel von Bytes übergeben, welche die Speicherinformation enthält. Wie kann ich die Daten in die richtigen Werte zu konvertieren:
response = (0, 0, 117, 143, 6)
Die ersten 4 Werte sind ein 32-Bit-int mir zu sagen, wie viele Bytes verwendet wurden, und der letzte Wert ist der Prozentsatz verwendet wird.
ich das Tupel als Antwort zugreifen kann [0] kann aber nicht sehen, wie ich die ersten vier Werte in den int bekommen kann ich brauche.
Lösung
Siehe konvertieren Bytes zu Gleitkommasystems in Python
Sie wollen wahrscheinlich die Struktur-Modul verwenden, z.
import struct
response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))
Unter der Annahme eines unsigned int. Es kann ein besserer Weg, um die Konvertierung zu tun zu entpacken, eine Liste Verständnis mit Join war nur das erste, was ich kam mit.
Bearbeiten . Sehen ΤΖΩΤΖΙΟΥ Kommentar zu dieser Antwort auch auch endianness in Bezug auf
EDIT # 2 : Wenn Sie nicht so gut mit dem Array-Modul nichts dagegen, hier ist eine alternative Methode, die die Notwendigkeit einer Liste Verständnis vermeidet. Dank @ JimB als auch auf Arrays arbeiten kann, dass auspacken für den Hinweis auf.
import struct
from array import array
response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)
Andere Tipps
Würde,
num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]
Ihre Bedürfnisse?
Hilfe
OK, Sie geben nicht die endinanness oder ob die ganze Zahl ist unterschrieben oder es (vielleicht) ist schneller mit der Struktur-Modul aber:
b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))
Sie können auch die Verwendung des Array-Modul machen
import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)
(30095L,)
Das sieht wie ein Job für reduzieren!
Was Sie im Grunde brauchen, ist, ein Byte zu einem Zeitpunkt Bit-Verschiebung, und fügen Sie dann (zusätzlich) das nächste Byte in der Sequenz.
a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326
Wie über die Karte Funktion:
a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)
Auch ich weiß nicht, ob dies den Sie suchen:
response = (0, 0, 117, 143, 6)
response[0:4]