Pythonを使用してデバイスと通信しようとしています。ストレージ情報を含むバイトのタプルが渡されました。データを正しい値に変換するにはどうすればよいですか?
応答=(0、0、117、143、6)
最初の4つの値は32ビット整数で、使用されたバイト数を示し、最後の値は使用されたパーセンテージです。
response [0]としてタプルにアクセスできますが、最初の4つの値を必要なintに取得する方法がわかりません。
だろう、
num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]
あなたのニーズを満たす?
援助
Python でバイトを浮動小数点数に変換するを参照してください。
おそらく struct モジュールを使いたいと思うでしょう。
import struct
response = (0, 0, 117, 143, 6)
struct.unpack(">I", ''.join([chr(x) for x in response[:-1]]))
unsigned int と仮定します。unpack への変換を行うためのより良い方法があるかもしれません。join を使用したリスト内包表記は、私が最初に思いついたものです。
編集:エンディアンに関するこの回答に対するΤΖΩΤΖΙΟΥのコメントも参照してください。
EDIT #2 : array モジュールを使用してもかまわない場合は、リスト内包表記を不要にする別の方法を次に示します。unpack が配列でも動作できることを指摘してくれた @ JimBに感謝します。
import struct
from array import array
response = (0, 0, 117, 143, 6)
bytes = array('B', response[:-1])
struct.unpack('>I', bytes)
array モジュールを利用することもできます
import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)
(30095L,)
OK、エンディナンネス、または整数が符号付きかどうかを指定しません。また、(おそらく) struct モジュールを使用する方が高速ですが、:
b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))
これはreduceの仕事のようです!
基本的に必要なのは、一度に 1 バイトずつビットシフトしてから、シーケンスの次のバイトを追加 (追加) することです。
a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326
マップ機能を使用するのはどうですか:
a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)
また、これがあなたが探しているものかどうかわかりません:
response = (0, 0, 117, 143, 6)
response[0:4]