2012-05-04 4 views
0

pyusb를 사용하여 USB를 통해받은 정수 값 배열을 16 진수 값 목록으로 변환하고 싶습니다. 이 16 진수 값에 항상 2 바이트 (예 : 0x ##)를 사용하고 싶습니다. 그러나 정상적인 16 진수() 함수는 입력 1과 함께 0x1을 반환합니다. 나는 0x01을 반환하고 싶습니다.정수를 16 진수로 변환하여 항상 2 바이트를 출력합니다.

그런 다음 '0x'부분을 버리는 동안 함께 16 진수 값 목록을 추가하고 싶습니다. 이것은 내가 현재 가지고있는, 아주 간단합니다.

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]) 

아이디어가 있으십니까? 나는 그것을 어색하게 할 수는 있지만 그럴 수있는 방법은 없지만, 올바른 방법이 있기를 바랬다. 고맙습니다.

업데이트 : 결과 16 진수 값이 기술적으로 내 코드에서 문자열 때부터 Lavon에 의해 제안

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'] 

방법은 작동하지 않았다? 대신에 저는 루프 전체를 16 진수로 변환하기 위해 건너 뛰었습니다. Lavon과 moooeeeep가 제안 했으므로 직접 실행했습니다! 감사!

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

구문에 사용할 좋은 참조가 있습니까? 즉 '% 02x'를 사용하셨습니까? 나는 그것을 전에 보지 않고 그것을 더 잘 이해하고 싶다.

+0

을 할 그냥 다른 방법 : @moooeeeep에 의해 제안

또한, 여기에 발전기를 사용하는 솔루션입니다 그것들은 바이트가 아닙니다. 그것들은 [nibbles] (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

그런 다음 '0x'부분을 버리는 동시에 16 진수 값 목록을 작성한 후 추가하고 싶습니다.

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' 
관련 문제