Разделение шестнадцатеричной строки в списке в Python - Как? - PullRequest
5 голосов
/ 03 июля 2010

Если у меня есть эта строка:

hexstring = '001122334455'

Как я могу разбить это на список, чтобы получить результат:

hexlist = ['00', '11', '22',' 33 ',' 44 ',' 55 ']

Я не могу придумать хорошего, питонского способа сделать это: /

Ответы [ 7 ]

10 голосов
/ 03 июля 2010
>>> [hexstring[i:i+2] for i in range(0,len(hexstring), 2)]
['00', '11', '22', '33', '44', '55']
7 голосов
/ 03 июля 2010

В качестве альтернативы:

>>> hexstring = "01234567"
>>> it=iter(hexstring); [a+b for a,b in zip(it, it)]
['01', '23', '45', '67']

Используйте itertools.izip вместо zip, если вы нацелены на Python 2.x.

Этот метод является определенной версией grouper в рецепте itertools.


Некоторые микро-тесты:

$ python2.6 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in xrange(0,len(hexstring), 2)]'
1000 loops, best of 3: 409 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000 loops, best of 3: 438 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"*500' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000 loops, best of 3: 526 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"*500; from itertools import izip' 'it=iter(hexstring); [a+b for a,b in izip(it, it)]'
1000 loops, best of 3: 406 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"*500; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000 loops, best of 3: 458 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"*500' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000 loops, best of 3: 756 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"*500' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000 loops, best of 3: 414 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"*500; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000 loops, best of 3: 865 usec per loop


$ python2.6 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in xrange(0,len(hexstring), 2)]'
1000000 loops, best of 3: 1.52 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
1000000 loops, best of 3: 1.76 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
100000 loops, best of 3: 3.78 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"; from itertools import izip' 'it=iter(hexstring); [a+b for a,b in izip(it, it)]'
100000 loops, best of 3: 2.39 usec per loop

$ python2.6 -m timeit -s 'hexstring = "01234567"; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
1000000 loops, best of 3: 1.45 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"' '[hexstring[i:i+2] for i in range(0,len(hexstring), 2)]'
100000 loops, best of 3: 2.46 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"' 'it=iter(hexstring); [a+b for a,b in zip(it, it)]'
1000000 loops, best of 3: 1.84 usec per loop

$ python3.1 -m timeit -s 'hexstring = "01234567"; import re; r=re.compile(".{1,2}"); f=r.findall' 'f(hexstring)'
100000 loops, best of 3: 2.07 usec per loop

Наблюдение:

  • С длинными строками на Python 2.6, @ SilentGhost и мой метод самые быстрые. Конечно, вам нужно использовать ленивые итераторы, например, xrange и izip.
  • С короткими строками в Python 2.6, регулярное выражение @ Nick является самым быстрым.
  • На Python 3.1 мой метод самый быстрый в обоих случаях, но я считаю, что это потому, что Python 3.x менее оптимизирован.
  • Конечно, преждевременная оптимизация - это зло и т. Д. .
2 голосов
/ 03 июля 2010

Использование регулярных выражений:

>>> import re
>>> re.findall('.{1, 2}', '001122334455')
['00', '11', '22', '33', '44', '55']
>>> 
1 голос
/ 03 июля 2010
hexstring = "01234567"
[''.join(x) for x in zip(*[iter(hexstring)]*2)]
1 голос
/ 03 июля 2010

Немного странный способ:

map(''.join,zip(hexstring[::2],hexstring[1::2]))
0 голосов
/ 16 июля 2015

как насчет этого? Некоторые двоичные файлы получили single (), некоторые получили (\), некоторые \\ и неизвестные (hex?), Например x99wh

(b'E \ x00 \ x00 (H \ xd2 @)\ x00 \ x80 \ x06 \ xa1J \ xc0 \ xa8 \ x01! = [\ x11 \ x8f \ xc5 [\ x01 \ xbb \ x99wh \ xcd \\ xb2 \ xcdQP \ x10 \ x82t) M \ x00 \ x00 ', ('192.168.1.33', 0))

Использование socket.socket (socket.AF_INET, socket.SOCK_RAW) в окне

Вот пример linux.http://www.binarytides.com/python-packet-sniffer-code-linux/

0 голосов
/ 06 июня 2013

Функциональный стиль:

>>> result = map(lambda x,y : x+y, *[iter('0013A20040522BAA')]*2)
>>> tuple(result)
('00', '13', 'A2', '00', '40', '52', '2B', 'AA')

или еще другой вариант около zip, как предлагалось ранее:

>>> result = (a+b for a,b in zip(*[iter('0013A20040522BAA')]*2))
>>> tuple(result)
('00', '13', 'A2', '00', '40', '52', '2B', 'AA')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...