Вы должны взглянуть на модуль bitstring , который недавно достиг версии 2.0.
Двоичные данные компактно хранятся в виде байтового массива и могут быть легко созданы, изменены и проанализированы.
Вы можете создавать BitString
объекты из двоичных, восьмеричных, шестнадцатеричных, целых чисел (с прямым или младшим порядковым номером), строк, байтов, чисел с плавающей точкой, файлов и т.
a = BitString('0xed44')
b = BitString('0b11010010')
c = BitString(int=100, length=14)
d = BitString('uintle:16=55, 0b110, 0o34')
e = BitString(bytes='hello')
f = pack('<2H, bin:3', 5, 17, '001')
Затем вы можете анализировать и изменять их с помощью простых функций или обозначений срезов - не нужно беспокоиться о битовых масках и т. Д.
a.prepend('0b110')
if '0b11' in b:
c.reverse()
g = a.join([b, d, e])
g.replace('0b101', '0x3400ee1')
if g[14]:
del g[14:17]
else:
g[55:58] = 'uint:11=33, int:9=-1'
Существует также концепция битовой позиции, так что вы можете рассматривать ее как файл или поток, если это полезно для вас. Свойства используются для различных интерпретаций битовых данных.
w = g.read(10).uint
x, y, z = g.readlist('int:4, int:4, hex:32')
if g.peek(8) == '0x00':
g.pos += 10
Плюс есть поддержка стандартных побитовых двоичных операторов, упаковка, распаковка, порядковый номер и многое другое. Последняя версия предназначена для Python 2.7 и 3.x, и хотя это чистый Python, он достаточно хорошо оптимизирован с точки зрения памяти и скорости.