2017-01-25 9 views
1

У меня есть строки hex, например, «01ff6fee32785e366f710df10cc542B4», и я пытаюсь их преобразовать (эффективно) в массив int 2 символа на 2 символа, например [1,255, ...].Как преобразовать hex str в массив int

Я попытался

c = '8db6796fee32785e366f710df10cc542B4' 
c2=[int(x,16) for x in c] 

но только принимает символы, один за другим. Могу ли я сделать это без использования цикла for (возможно, я ошибаюсь, но если думаю, что это будет медленнее)?

+0

Это все шестнадцатеричное число? –

+0

да, это 32 символа – Grimsovitch

+1

Ваш первый пример «01ff6fee32785e366f710df10cc» составляет 27 символов! – cdarke

ответ

2

Вы мог range(..) над подстроками длиной 2:

c = '8db6796fee32785e366f710df10cc' 
c2=[int(c[i:i+2],16) for i in range(0,len(c),2)] 

Так i итерации струны с шагом 2 и вы принимаете подстроку длины 2 от i до i+2 (эксклюзив) с c[i:i+2]. Они конвертируются, беря int(..,16).

Для вашего ввода образца он генерирует:

>>> c='8db6796fee32785e366f710df10cc' 
>>> [int(c[i:i+2],16) for i in range(0,len(c),2)] 
[141, 182, 121, 111, 238, 50, 120, 94, 54, 111, 113, 13, 241, 12, 12] 

Последний элемент 12, так как длина струны вашей нечетно, поэтому она принимает c как последний элемент для разбора.

+0

Это похоже на работу, спасибо! – Grimsovitch

0
>>> c = '8db6796fee32785e366f710df10c' 
>>> [int(x) for x in bytearray.fromhex(c)] 
[141, 182, 121, 111, 238, 50, 120, 94, 54, 111, 113, 13, 241, 12] 
>>> list(map(int, bytearray.fromhex(c))) 
[141, 182, 121, 111, 238, 50, 120, 94, 54, 111, 113, 13, 241, 12] 

Два относительно простые решения, но это будет ошибка, если строка имеет нечетное число символов, которые могут или не могут быть то, что вы хотите.