8

Pythonを使用してデバイスと通信しようとしています。ストレージ情報を含むバイトのタプルが渡されました。データを正しい値に変換するにはどうすればよいですか?

応答=(0、0、117、143、6)

最初の4つの値は32ビット整数で、使用されたバイト数を示し、最後の値は使用されたパーセンテージです。

response [0]としてタプルにアクセスできますが、最初の4つの値を必要なintに取得する方法がわかりません。

4

6 に答える 6

13

だろう、

num = (response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[3]

あなたのニーズを満たす?

援助

于 2008-12-22T17:36:02.887 に答える
11

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)
于 2008-12-22T17:10:02.877 に答える
4

array モジュールを利用することもできます

import struct
from array import array
response = (0, 0, 117, 143, 6)
a = array('B', response[:4])
struct.unpack('>I', a)

(30095L,)
于 2008-12-22T18:41:19.400 に答える
4

OK、エンディナンネス、または整数が符号付きかどうかを指定しません。また、(おそらく) struct モジュールを使用する方が高速ですが、:

b = (8, 1, 0, 0)
sum(b[i] << (i * 8) for i in range(4))
于 2008-12-22T17:39:55.517 に答える
2

これはreduceの仕事のようです!

基本的に必要なのは、一度に 1 バイトずつビットシフトしてから、シーケンスの次のバイトを追加 (追加) することです。

a = (0, 0, 117, 143, 6)
reduce(lambda x, y: (x<<8) + y, a)
7704326
于 2011-04-20T23:26:12.630 に答える
0

マップ機能を使用するのはどうですか:

a = (0, 0, 117, 143, 6)
b = []
map(b.append, a)

また、これがあなたが探しているものかどうかわかりません:

response = (0, 0, 117, 143, 6)
response[0:4]
于 2009-05-24T08:56:54.047 に答える