2015-06-09 2 views

ответ

2
A = [0xaa, 0xbb, 0xcc] 
d = reduce(lambda x, y: x*256 + y, A) 
print hex(d) 
+0

Я предлагаю вам использовать 'х << y.bit_length () 'вместо' x * 256', чтобы сделать ваш код более гибким. – Alik

+2

@Alik. Вы правы, но только если исходный вопрос хочет иметь дело с битами вместо байтов. Обратите внимание, что для 'a = 1'' a.bit_length() 'дает 1. – dlask

+1

О, я не думал об этом вопросе. Я думаю, что OP должен уточнить, что он хочет делать. – Alik

3

Использование hex(), map() и join().

>>> '0x' + ''.join(map(hex, A)).replace('0x', '') 
'0xaabbcc' 

Или с lambda:

>>> '0x' + ''.join(map(lambda x: hex(x)[2:], A)) 
'0xaabbcc' 

Благодаря @John Ла Роя за указание на то, что это не удается с 1-х цифр. Следующая модификация версии lambda лучше:

>>> B = [0x1, 0x4, 0x3] 
>>> '0x' + ''.join(map(lambda x: hex(x)[2:].rjust(2, '0'), B)) 
'0x010403' 

Но в тот момент, что лучше использовать ответ Джона.

+1

Что делать, если некоторые элементы A <0x10? –

5

Для Python3 +, int имеет метод для этого

>>> A=[0xaa, 0xbb, 0xcc] 
>>> hex(int.from_bytes(A, byteorder="big")) 
'0xaabbcc' 

>>> 0xaabbcc == int.from_bytes(A, byteorder="big") 
True 

Для python2, это, вероятно, лучше, чтобы написать небольшую функцию

>>> A = [0xaa, 0xbb, 0xcc] 
>>> 
>>> def to_hex(arr): 
...  res = 0 
...  for i in arr: 
...   res <<= 8 
...   res += i 
...  return res 
... 
>>> 0xaabbcc == to_hex(A) 
True 
Смежные вопросы