2012-05-04 26 views
0

我想通過使用pyusb通過USB接收的整數值數組轉換爲十六進制值列表。我希望這些十六進制值總是有兩個字節,即0x ##。然而,正常的十六進制()函數將返回0x1,輸入爲1.我希望它返回0x01。將整數轉換爲十六進制,結果總是有2個字節

然後,在得到十六進制值列表後,我想將它們追加在一起,同時丟掉'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建議的方法,因爲所產生的十六進制值在技術上在我的代碼串沒有工作?相反,我只是跳過我整個循環轉換爲十六進制,並直接做了拉文和moooeeeep建議,它的工作!謝謝!

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

是否有一個很好的語法參考?即您使用的'%02x'?我之前沒有看到過,希望更好地理解它。

+0

那些不是字節。這些是[nibbles](http://en.wikipedia.org/wiki/Nibble)。 – senderle

+0

在'dev.read(0x82,64,0,1000)'中,所有值是十六進制還是隻有具有前導'0x'的值? – 2012-05-04 22:03:38

+0

@senderle是啊腦放屁那裏,晚了一天 – raymond

回答

1

這是否符合法案?

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

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

產量:

010405FF12 

使用列表中理解和連接操作。

另外,通過@moooeeeep的建議這裏是使用一臺發電機的解決方案:

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

然後,在得到十六進制值列表後,我想將它們追加在一起,同時丟棄'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' 
相關問題