2009-12-07 3 views
3

У меня есть бит-бит с кодировкой base64, с которым я хочу работать. После его декодирования с base64.b64decode я получаю объект байтов (Py3k btw), содержащий декодированный код. Проблема в том, что я хотел бы работать над этим байтовым объектом с битовыми операциями, такими как сдвиг, бит wise and и т. Д., Но это невозможно, так как это последовательность байтов.Работа с битовыми потоками

Есть ли способ использовать двоичные операции над этим декодированным кодом?

+1

Вы можете преобразовать его в один (длинный) целое число, а затем работать с этим – Knio

+0

@Knio: Пожалуйста, пост, что в качестве ответа, а не комментарий. –

ответ

4

попробуйте использовать

list(bytestring) 

Ев.

>>> bstring=b"Hello World" 
>>> list(bstring) 
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100] 
>>> 

Если вы хотите один огромный битовое вместо всех этих октетов

>>> from functools import reduce 
>>> reduce(lambda x,y:(x<<8)+y,list(b"Hello World")) 
87521618088882533792115812 
>>> bin(_) 
'0b100100001100101011011000110110001101111001000000101011101101111011100100110110001100100' 
>>> 

Вы не говорите, как вы подсчет битов, возможно, они должны быть отменены

>>> reduce(lambda x,y:(x<<8)+y,list(b"Hello World"[::-1])) 
121404708493354166158910792 
>>> bits=bin(_)[2:] 

и заполнить строку до четных байтов

>>> bits=bits.zfill(((len(bits)-1)//8+1)*8) 
>>> bits 
'0110010001101100011100100110111101010111001000000110111101101100011011000110010101001000' 

превратить первые 6 битов в INT

>>> int(bits[:6],2) 
25 

, а затем следующие 4 бита

>>> int(bits[6:10],2) 
1 
+0

Проблема в том, что мне нужно работать между каждыми байтами. Например, 6 бит байта 1, затем остальные 2 бита и первые 2 бита байта 2 и т. Д. – poke

+0

Хорошо, я добавил, как сделать большое длинное битовое поле :) –

+0

У меня тоже было что-то подобное, но я сделал " Мне очень нравится идти со строкой между ними, учитывая, что я дам вам много ресурсов. Я надеялся, что при работе с чистыми двоичными данными будет использоваться более собственный подход. – poke

0

Если вы используете Python 2.x, вы можете попробовать использовать Construct. Он может выполнять очень элегантный анализ данных, включая bit data.

В последнее время этого не было так активно, поэтому я не уверен, что бы это заставило его работать на Python 3.x. Но для 2.x это здорово.

2

Если вам нужно, чтобы сделать ваш bytes объект изменчивым, то вы можете построить bytearray из него:

mutable = bytearray(b"immutable") 

Это позволит вам изменять отдельные байты с помощью обычных заданий

mutable[0] = mutable[1] = 32 

Если вам нужно для выполнения побитовых операций, я предлагаю попробовать bitstring (с извинениями за рекомендацию моего собственного модуля). Он работает для Python 3 и позволяет выполнять бит-мутную нарезку, перемещение, логические операции и многое другое.

>>> s = bitstring.BitArray(bytes=b'your_bytes_object') 
>>> s.hex 
'0x796f75725f62797465735f6f626a656374' 
>>> ten_bits = s[5:15] 
>>> print(ten_bits, ten_bits.int) 
0b0010110111 183 
>>> print(ten_bits << 2) 
0b1011011100 
>>> print(s[0:6] & '0b110100') 
0b010100 
+0

Спасибо, я посмотрю на этот модуль :) – poke

Смежные вопросы