2009-12-11 134 views
15

ソケットからバイト配列/リストを読み込んでいます。 Pythonが最初のバイトを「符号なし8ビット整数」として扱うようにしたい。その整数値を符号なし8ビット整数としてどのように得ることが可能ですか?Pythonバイトを「符号なし8ビット整数」に変換する

+1

'numpy'に依存したい場合、関数の中には' dtype'引数をとります。これは 'numpy.uint8'に設定することができます。 例: 'バイトストリーム= numpy.fromfile(INFILE、DTYPE = numpy.uint8)' – CrazyPyro

答えて

21

structモジュールを使用してください。

import struct 
value = struct.unpack('B', data[0])[0] 

unpackは、アイテムを1つしか展開していない場合でも、必ずタプルを返します。

また、this SO questionをご覧ください。あなたが一度にあなたの受信データのすべての要素を解凍したい場合

value = ord(data[0]) 

+0

あなたはどのように表示できますか? – bbb

+0

struct.unpack( 'B'、data [0])[1]には何が格納されていますか? – bbb

+0

data [0]は、受信した最初のバイトです。 unpack( "B"、data [0])はそのバイトを8ビットの符号なし整数(Cではunsigned charと呼ばれます)として扱い、その整数を含むタプルを返します。 ( "BB"、データ[0:2])、2タプルを返す)。最後の[0]は、タプルの最初の(そして唯一の)項目を取得します。 – codeape

7

バイト/ bytearrayは整数のシーケンスです。あなただけのインデックスで要素にアクセスする場合は、整数があります:彼らは非常に定義することにより

>>> b'abc' 
b'abc' 
>>> _[0] 
97 

を、バイトByteArrayとして定義はrange(0, 256)に整数を含んでいます。したがって、それらは「符号なし8ビット整数」です。

+0

は、例えば、私は限り私を理解するように、私のサーバ側コードで データ= conn.recv(1000000) これを有します私はデータ[0]が "符号なし8ビット整数"として扱われることを望みます。これはどのように可能ですか? – bbb

+0

これはPython 3.xでのみ動作します。 Python 2.6にはb'stringリテラル構文がありますが、これは単にstrのエイリアスに過ぎず、古いバージョンではSyntaxErrorが得られます。 – musicinmybrain

+0

@musicinmybrain:そのため、この質問は 'python-3.x'とタグ付けされています。 – SilentGhost

7

もう一つの非常に合理的でシンプルなオプション、あなただけの最初のバイトの整数値が必要な場合は、以下のようなものになるだろう(そしてそれらは単なる配列ではない)、または32ビット整数のようなマルチバイトオブジェクトを扱う場合は、structモジュールのようなものを使う必要があります。

関連する問題