質問

グラフィックライブラリを使用しています ピグレット いくつかの図面を行い、結果の画像をPythonリストとして表示したい(だから私はそれをに変換することができます numpy 配列)。

Pygletは、次のような1ヘクス文字の文字列を与えてくれます: ' xff'(1ピクセルで255の値を示します)。そのような文字列をintに変換するにはどうすればよいですか?

私はint( ' xff'、16)を試しましたが、それはうまくいきません。によると、 ドキュメント, 、 ' xnn'は脱出され、六角形のcharとしてエンコードされますが、それをintに変換する方法は教えてくれません。

役に立ちましたか?

解決

Python文字列から直接numpy配列を取得するには、使用できます

s = "\xff\x03"
a = numpy.frombuffer(s, numpy.uint8)

リストを取得するには、使用できます

a =  map(ord, s)

Python 2.6以上のリストに代わるものは、使用することです bytesarray(s).

他のヒント

このようなことを試してみてください:

a = '\xff'
print int(a.encode('hex'), 16)
255

編集:申し訳ありませんが、以前のバージョンには間違いがありました - エンコードの代わりにデコード。これは機能します。

編集2:コメンターが指摘したように、私は実際に質問を誤解しました。これはすでに明らかなかもしれませんが、誰かが通常のPythonリストソリューションが役立つと判断した場合には次のものがあります。

>>> a = '\xff\xfe'
>>> [str(ord(char)) for char in a]
['255', '254']
>>> ' '.join([str(ord(char)) for char in a])
'255 254'

これは、可変長さのサブストリングを備えた16進ストリングを処理する一般化されたアプローチです。

s = '5b1\n5\n3ad44'

次のコードは、300万の可変長ヘックスサブストリングを持つ文字列を、ベクトル化により2秒で(MacBookで)numpy整数アレイに変換します。

import numpy as np, pandas as pd, cStringIO

s = ('5b1\n5\n3ad44\n' * 1000000)[:-1]    # 3m item hex string (variable element length)

# change hex to 2 digit decimal
for i in range(0,9): s = s.replace(str(i),'0' + str(i))  
for i in [['a','10'],['b','11'],['c','12'],['d','13'],['e','14'],['f','15']]:
    s = s.replace(i[0],i[1])

# read string into numpy
n = np.array(pd.read_csv(cStringIO.StringIO(s), header=None)[[0]]).astype('int64')    

# fix base
n = (n % 100) + 16 * ((n % 10000)/100) + 256 * ((n % 1000000)/10000) + 4096 * ((n % 100000000)/1000000) + 65536 * ((n % 10000000000)/100000000)

n[0:3]    # confirm correct transformation to [1457, 5, 240964]

はい、 \xff バイト内のヘックス値の印刷表現です。しかし int() バイトのヘックス表現ではなく、数字の文字列表現では機能します。 Base-16の世界の数字は「13」または「AB」または「FF」です。その結果(しかし、それでも面白い)、 int('ff',16) 正常に動作します。そのルートに行きたい場合は、 ' x' :-)を取り除く必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top