2009-12-07 5 views
3

J'ai un flux de bits codé en base64, je veux travailler avec. Après décodage avec base64.b64decode je reçois un objet octets (Py3K BTW) contenant le code décodée. Le problème est maintenant, que je voudrais travailler sur cet objet octets avec des opérations bit à bit, comme le déplacement, peu sage and etc, mais ce n'est pas possible car il est une séquence d'octets.Travailler avec des cours d'eau peu

Est-il possible d'utiliser des opérations binaires sur ce code décodée?

+1

Vous pouvez le convertir en un (long) entier et travailler avec ce – Knio

+0

@Knio: S'il vous plaît poster que comme une réponse, pas un commentaire. –

Répondre

4

essayez d'utiliser

list(bytestring) 

Par exemple.

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

Si vous voulez un énorme bitfield au lieu de tous les octets

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

Vous ne dites pas comment vous comptez les bits, peut-être qu'ils sont censés être inversé

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

et bourrer la chaîne pour égaliser les octets

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

tourner les 6 premiers bits dans un int

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

puis les 4 bits suivants

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

Le problème est que je dois travailler entre chaque octet. Par exemple 6 bits de l'octet 1, puis les 2 bits restants et les 2 premiers bits de l'octet 2 etc. – poke

+0

Ok, j'ai ajouté comment faire un gros long bitfield :) –

+0

J'avais déjà quelque chose comme ça, mais je l'ai fait ' J'apprécie vraiment d'avoir une corde entre les deux, étant donné que je donnerais beaucoup de ressources par là. J'espérais une approche plus native lorsque je travaillais avec des données binaires pures. – poke

0

Si vous utilisez Python 2.x, vous pouvez essayer d'utiliser Construct. Il peut faire l'analyse très élégante des données, y compris bit data.

Il n'a pas eu tant de développement actif récemment, donc je ne suis pas sûr de ce que serait impliqué dans le faire fonctionner pour Python 3.x. Mais pour 2.x c'est génial.

2

Si vous devez faire votre bytes objet mutable alors vous pouvez construire un bytearray de celui-ci:

mutable = bytearray(b"immutable") 

Cela vous permettra de modifier les octets individuels grâce à des affectations normales

mutable[0] = mutable[1] = 32 

Si vous avez besoin pour faire des opérations peu-sages alors je suggère d'essayer bitstring (avec des excuses pour recommander mon propre module). Cela fonctionne pour Python 3 et vous permet de découper, de déplacer, d'effectuer des opérations logiques et bien plus encore.

>>> 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

Merci, je vais jeter un oeil à ce module :) – poke