[pyar] Manipulacion de Bits

Juan Ignacio euribates en gmail.com
Vie Ene 24 06:54:32 ART 2014


También puedes usar struct, que viene en la librería estándar:

http://www.python.org/doc//current/library/struct.html

--[Código python]---------------------

import struct

i = struct.unpack('>I', '\x00\x00\x03\x13')[0]
# i = 787
# bin(i) = '0b1100010011'

b8 =   (i & 0b10000000) >> 7               # octavo bit del primer byte
b1_7 =  (i & 0b1111111)                   # 7 bits restantes del primer byte

b16 =    (i & 0b1000000000000000) >> 15  # Dieciseisavo bit
b15_13 = (i &  0b111000000000000) >> 12  # bits 15 al 13 (7 al 5 del 2º
byte)
b12_11  = (i &    0b110000000000) >> 10  # bits 12 al 11 (4 al 3 del 2º
byte)
b10_9   = (i &      0b1100000000) >> 8   # bits 10 al 9 (2 al 1 del 2º byte)

--[Fin código python]--------------------

Notas:

1) El significado del parámetro ">I" del unpack es: Considera el segundo
parámetro como un entero sin signo (I) empaquetado en Big endian ('>').
Hay que añadir dos bytes más ('\x00') para que se correspondan en tamaño:
Un entero sin signo o long en C == 4 bytes. unpack siempre devuelve
una tupla, de hay lo del [0].

2) En python puedes expresar números en binario directamente con
  el prefijo 0b: 0b10110 == 22. Para expresar máscaras creo que queda más
  claro

3) & es el operador and para binario, >> el de desplazamiento binario

4) El código anterior se entiende mejor si lo vemos en una fuente
monoespaciada.


2014/1/23 Nicolás Rebagliati <nicolas.rebagliati en aenima-x.com.ar>

> Termine haciéndote caso
>
> class Address(object):
>     def __init__(self, buf):
>         first_byte = ord(buf[0])
>         second_byte = ord(buf[1])
>         self.odd = first_byte >> 7
>         self.nature_of_address = first_byte & 0x87
>         self.number_incomplete = second_byte >> 7
>         self.numbering_plan = (second_byte >> 4) & 0xf
>         self.address_presentation = (second_byte >> 2) & 0x03
>         self.screening_indicator = second_byte & 0x03
>
>
> On Jan 23, 2014, at 4:35 PM, Roberto Alsina <ralsina en netmanagers.com.ar>
> wrote:
>
> > On 23/01/14 16:24, Nicolás Rebagliati wrote:
> >> Buenas, saben de algún modulo para manipular bits que sea rápido
> (BiteReader esta bueno, pero no es muy rapido), para no tener que usar
> bitwise operators que son una patada en los huevos con carrera.
> >>
> >> Ejemplo de lo que necesito, teniendo este byte string: '\x03\x13’
> >> necesito el 8vo bit del primer byte, el valor de los 7 bits restantes
> del primer byte, el 8 del 2do byte, del el valor del 7 al 5, el valor del 4
> al 3 y el valor del 2 al 1.
> >> Se entiende??
> >> Ojo cuando digo:  el valor de los 7 bits restantes del primer byte. No
> me refiero a cada bit, sino al valor total en decimal de esos 7 bits.
> >>
> >>
> > Este... usar aritmética?
> >
> > Ese bytestring es 787
> >
> > el 8vo bit del primer byte es (787&256)/256
> > El 8vo del 2do byte es 787&1
> >
> > No tengo idea de que quiere decir "[el] valor total en decimal de esos 7
> bits. " o "el valor del 4 al 3", etc.
> >
> > Por ejemplo, si lo que queres es el valor de los bits 4 y 5 desde la
> derecha (porque hay que ver como los contás ;-) es algo como 787&24 que te
> da 16 (o sea, el 5 es 1, el 4 es 0). Si lo que queres es el valor de esos
> dos bits solos, y que te de 2 es (787&24)/8
> >
> > Disclaimer, esto esta hecho mas a ojo que otra cosa, y debe haber por lo
> menos un off-by-one ;-)
> > _______________________________________________
> > pyar mailing list pyar en python.org.ar
> > http://listas.python.org.ar/listinfo/pyar
> >
> > PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> >
> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
Juan Ignacio Rodríguez de León
Móvil: 605 890514
E-Mail: euribates en gmail.com
http://www.metriz.com/
http://descon2.com/
http://www.elornitorrincoenmascarado.com/
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140124/80b0319f/attachment-0001.html>


More information about the pyar mailing list