2011-09-26 22 views
21

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

、私は単なるバイトの配列を構築する必要があります:

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に関する非常に基本的な質問であることを知っています。正しい方向に私を指すことができれば...

+3

上記のコードの問題は、リストの代わりに整数が与えられた場合、 'bytes'は非常に異なった動作をすることです。 'frame + = bytes([int( '0xa2'、16)])'を使うべきです。 –

+0

私はあなたがこれを動的に行うことを望んでいることを知っていますが、完全にはわかりませんが、入力バイトはどこから来ますか?あなたはテキストファイルから16進表記を読みますか?各バイトをソースコードに書き留めますか?あなたはstdinからバイナリを読んだことによって得たbytearrayにそれらを持っていますか? –

答えて

27

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' 
+0

答えが解決策として使用されない場合は、bytearrayというタグを質問に追加しました。 –

+0

@clinisbutこれはまだ関連しています。一般的な意味では、bytearray型を使用していなくても、バイト配列(コンセプト)を使用しています。私の答えの2つの方法のどちらかがあなたの問題を解決するはずです。 – agf

+0

'bytearray'を' bytes'と置き換えて、ほぼ同じ結果を得ることができます。 'bytearray'は可変型ですので、フレームを作るための' bytes'よりも便利です。 –

0

私はScapyを探しています。

http://www.secdev.org/projects/scapy/

あなたはそれをフレーム(パケット)を構築し、送信することができます

+1

ありがとうございましたが、私はそれをやる方法をもっと学びたいと思っています;) –

+0

scapyは、一般的なネットワークやパケットプロジェクトのための素晴らしいツールです。あなたが探しているものは、次のようなものだと思います: >>> from struct import * >>>>>> packet( 'Bbbbb'、162,1,2,3,4、) > >>>パケット > '\ xa2 \ x01 \ x02 \ x03 \ x04' – Venec

+0

私はpythonで私の問題を解決したいと思います。 –

10

staからフレームを簡単に構築する方法ndardリスト?

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

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

6
frame = b'\xa2\x01\x02\x03\x04' 

は今...

+0

しかし、私はフレームを動的に構築する必要があります –

+1

バイト配列を構築するためのこの構文は、文字列型と同じように動作します:あなたはバイト配列を動的に構築するために '+'または他の同様の演算子を使うことができます。 –

2

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

関連する問題