6

私は現在、フライト シミュレーション プログラムであると通信するために書いている Python スクリプトに、Arduinoシリアル ( を使用) を介していくつかの整数 (int) を出力する を使用しています。pySerialArduinoX-Plane

オリジナルを 2 バイトに分割してスクリプトに送信できるようにしましたが、元の整数を再構築するのに少し問題があります。

C++ ライクなプログラムで行ったように、基本的なビット演算子 (<<、>> など) を使用してみましたが、機能していないようです。

データ型に関係していると思われます。同じ操作で整数とバイトを使用している可能性がありますが、私が知る限り、Python では変数を実際に宣言していないため、各変数が保持する型を実際にはわかりません (私は Python を初めて使用します)。 .

self.pot=self.myline[2]<<8
self.pot|=self.myline[3]
4

5 に答える 5

8

このstructモジュールを使用して、整数と表現をバイトとして変換できます。あなたの場合、Python整数から2バイトに変換して戻すには、次を使用します。

>>> import struct
>>> struct.pack('>H', 12345)
'09'
>>> struct.unpack('>H', '09')
(12345,)

との最初の引数は、データをどのようにフォーマットするかstruct.packstruct.unpack表します。ここでは、プレフィックス (リトルエンディアンまたはネイティブに>使用できます) を使用してビッグエンディング モードにするように要求し、 .<=H

その他の可能性はbB符号付きバイト、符号なしバイト、符号付き短整数h(16 ビット)、符号付き 32 ビット整数、符号なし 32 ビット整数です。モジュールのドキュメントを見ると、完全なリストを取得できます。iIstruct

于 2013-02-16T12:37:15.423 に答える
2

あなたが持っているものは、格納されmylineているデータが最初に上位バイトを持っていると仮定すると、基本的にはうまくいくようです:

myline = [0, 1, 2, 3]
pot = myline[2]<<8 | myline[3]

print 'pot: {:d}, 0x{:04x}'.format(pot, pot)  # outputs "pot: 515, 0x0203"

それ以外の場合、最初に下位バイトである場合は、逆の方法を実行する必要があります。

myline = [0, 1, 2, 3]
pot = myline[3]<<8 | myline[2]

print 'pot: {:d}, 0x{:04x}'.format(pot, pot)  # outputs "pot: 770, 0x0302"
于 2013-02-15T22:19:58.440 に答える
0

これは完全に機能します:

long = 500
first = long & 0xff  #244
second = long >> 8  #1
result = (second << 8) + first #500

'myline' の型がわからない場合は、Stack Overflow の質問How to determine the variable type in Python?を確認してください。.

于 2013-02-15T21:49:54.287 に答える
-1

バイトまたは文字をそれが表す数値に変換するには、を使用しますord()。これは、intからbytesへの単純なラウンドトリップです。

>>> number = 3**9
>>> hibyte = chr(number / 256)
>>> lobyte = chr(number % 256)
>>> hibyte, lobyte
('L', '\xe3')
>>> print number == (ord(hibyte) << 8) + ord(lobyte)
True

myline変数が文字列またはバイト文字列の場合は、上記の最後の行の式を使用できます。それがどういうわけか整数のリストであるなら、もちろんあなたは必要ありませんord

于 2013-02-15T21:56:19.023 に答える