[pyar] Manipulacion de Bits

Nicolas Rebagliati nicolas.rebagliati en aenima-x.com.ar
Vie Ene 24 10:37:03 ART 2014


Con struct manipulo los bytes, lastima que no tiene una interface para bits.


2014/1/24 Juan Ignacio <euribates en gmail.com>

> 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/
>
> _______________________________________________
> 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140124/36e74f3f/attachment.html>


More information about the pyar mailing list