2012-05-04 4 views
0

私は、pyusbを使ってUSB経由で受け取った整数値の配列を16進値のリストに変換したいと思います。これらの16進数の値には常に2バイト、つまり0x ##が必要です。しかし、通常のhex()関数は1の入力で0x1を返します。私は0x01を返したいと思います。整数を16進数に変換して結果を常に2バイトにする

その後、16進値のリストを作成した後、それらを一緒に追加して、 '0x'部分を捨ててしまいます。これは私が現在持っている、非常に簡単です。

data_read = dev.read(0x82,64,0,1000) 
hex_data = range(0,len(data_read)) 

for i in range(0,len(data_read)): 
    hex_data[i] = hex(data_read[i]) 

私はそれをすくい取ることができますし、それはやっかいな方法ですが、私はそれを行う適切な方法があることを望んでいました。ありがとうございました。

更新:結果進値が技術的に私のコード内の文字列だったので、

data_read = dev.read(0x82,64) 
print data_read 
>>> array('B', [169, 86, 128, 1, 0, 128]) 
for i in range(0,len(data_read)): 
     hex_data[i] = hex(data_read[i]) 
print hex_data 
>>> ['0xa9', '0x56', '0x80', '0x1', '0x0', '0x80'] 

Lavonによって提案された方法では動作しませんでしたか?代わりに私はちょうど16進に変換するループのために私の全体をスキップし、Lavonとmoooeeeepが示唆したように直接行いました。ありがとう!

hex_data = ('%02x' %i for i in data_read) 
print ''.join(hex_data) 
>>> a95680010080 

構文に使用する参考になりますか?あなたが使用した '%02x'ですか?私はそれを以前に見たことがなく、それをよりよく理解したいと思います。

+0

を行うにはちょうど別の方法:@moooeeeepにより示唆されるように

また、ここで発電機を使用したソリューションですこれらはバイトではありません。それらは[ニブル](http://en.wikipedia.org/wiki/Nibble)です。 – senderle

+0

'dev.read(0x82,64,0,1000)'には、すべて16進値か、先頭に '0x'を付けた値だけですか? –

+0

@senderle yeah brain fart there、late day – raymond

答えて

1

これは請求書に適していますか?

data = [0x1, 0x4, 0x5, 0xFF, 0x12] 

new_data = ['%02X' %i for i in data] 
print ''.join(new_data) 

利回り:リスト内包と結合操作を使用して

010405FF12 

。文字列の書式設定オプションについては

new_data = ('%02X' %i for i in data) 
print ''.join(new_data) 

、参照this

+0

リスト内包表記 '[]'の代わりに '()'を使うのが良いでしょう。 – moooeeeep

+1

@moooeeeepこんにちは..ジェネレーターが好きな理由を説明できますか?同意しないようにしようとはしませんが、その理由もわかりません。ありがとう。 – Levon

+0

それはオンザフライで 'new_data'を生成し、メモリを節約します(リスト全体が同時に利用可能である必要はありません)。 http://www.python.org/dev/peps/pep-0289/ – moooeeeep

1

次に、16進値のリストを作成した後、それらを一緒に追加して、「0x」部分を捨ててしまいます。

In [8]: data_read = [0x01, 0x2b, 0x22, 0x10] 

In [9]: ''.join(map(lambda v: '%02x' % v, data_read)) 
Out[9]: '012b2210' 

あなたはこのような何かを意味していますか?

0

それを

>>> data_read = [0x01, 0x2b, 0x22, 0x10] 
>>> ("{:02x}"*len(data_read)).format(*data_read) 
'012b2210' 
関連する問題