web-dev-qa-db-ja.com

Python 3バイト配列の構築

生のバイナリデータを使用してtcpフレームを構築する必要がありますが、バイトについて話しているすべての例とチュートリアルでは、常に文字列からの変換が必要であり、それは必要なものではありません。

要するに、バイトの配列だけを構築する必要があります。

0xA2 0x01 0x02 0x03 0x04

私はC/C++の世界から来ていることに注意してください。

私はこれを試しました:

frame = b""
frame += bytes( int('0xA2',16) )
frame += bytes( int('0x01',16) )
frame += bytes( int('0x02',16) )
frame += bytes( int('0x03',16) )
frame += bytes( int('0x04',16) )

次に、このフレーム変数を投げてソケットのメソッドを送信しますが、フレームに必要なものが含まれていないため、期待どおりに動作しません...

これはPythonに関する非常に基本的な質問であることがわかっているので、正しい方向に向けていただければ...

34
Raúl Ferràs

bytearray を使用します。

>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'\xa2\x01\x02\x03\x04')

または、コードを使用してエラーを修正します。

frame = b""
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03'
frame += b'\x04'
45
agf

標準リストからフレームを単純に構築するのはどうですか?

_frame = bytes([0xA2,0x01,0x02,0x03,0x04])
_

bytes()コンストラクターは、int値を含むイテラブルからバイトフレームを構築できます。イテレータは、イテレータプロトコルを実装するものです:リスト、イテレータ、range()...によって返されるようなイテレート可能なオブジェクト.

14
Adrien Plisson
frame = b'\xa2\x01\x02\x03\x04'

今まで言及されていませんでした...

7
glglgl

agfのbytearrayソリューションは実行可能ですが、バイト以外のデータ型を使用してより複雑なパケットを作成する必要がある場合は、struct.pack()を試すことができます。 http://docs.python.org/release/3.1.3/library/struct.html

4

バイトの配列(リスト)を取得するソリューションは次のとおりです。

Bytes()に渡す前に、まずIntをバイトに変換する必要があることがわかりました。

bytes(int('0xA2', 16).to_bytes(1, "big"))

次に、バイトからリストを作成します。

list(frame)

したがって、コードは次のようになります。

frame = b""
frame += bytes(int('0xA2', 16).to_bytes(1, "big"))
frame += bytes(int('0x01', 16).to_bytes(1, "big"))
frame += bytes(int('0x02', 16).to_bytes(1, "big"))
frame += bytes(int('0x03', 16).to_bytes(1, "big"))
frame += bytes(int('0x04', 16).to_bytes(1, "big"))
bytesList = list(frame)

問題は、バイトの配列(リスト)に対するものでした。リストを取得する方法を教えていない答えを受け入れたので、これが実際に必要なものであるかどうかはわかりません。

0
King Tech