生のバイナリデータを使用して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に関する非常に基本的な質問であることがわかっているので、正しい方向に向けていただければ...
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'
標準リストからフレームを単純に構築するのはどうですか?
_frame = bytes([0xA2,0x01,0x02,0x03,0x04])
_
bytes()
コンストラクターは、int
値を含むイテラブルからバイトフレームを構築できます。イテレータは、イテレータプロトコルを実装するものです:リスト、イテレータ、range()
...によって返されるようなイテレート可能なオブジェクト.
frame = b'\xa2\x01\x02\x03\x04'
今まで言及されていませんでした...
agfのbytearrayソリューションは実行可能ですが、バイト以外のデータ型を使用してより複雑なパケットを作成する必要がある場合は、struct.pack()
を試すことができます。 http://docs.python.org/release/3.1.3/library/struct.html
バイトの配列(リスト)を取得するソリューションは次のとおりです。
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)
問題は、バイトの配列(リスト)に対するものでした。リストを取得する方法を教えていない答えを受け入れたので、これが実際に必要なものであるかどうかはわかりません。