Wie kann ich Teil eines Tupels Python (Byte-Array) in eine ganze Zahl konvertiert

StackOverflow https://stackoverflow.com/questions/386753

  •  23-08-2019
  •  | 
  •  

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.

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top