[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