manipulation example bytes array python byte bits

example - python bit manipulation



Uso de Python ¿Cómo puedo leer los bits en un byte? (9)

Con numpy es fácil así:

Bytes = numpy.fromfile(filename, dtype = "uint8") Bits = numpy.unpackbits(Bytes)

Más información aquí:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

Tengo un archivo donde el primer byte contiene información codificada. En Matlab puedo leer el byte bit a bit con var = fread(file, 8, ''ubit1'') , y luego recuperar cada bit por var(1), var(2) , etc.

¿Hay algún lector de bits equivalente en python?


Esto es bastante rápido, pensaría:

import itertools data = range(10) format = "{:0>8b}".format newdata = (False if n == ''0'' else True for n in itertools.chain.from_iterable(map(format, data))) print(newdata) # prints tons of True and False


Hay dos formas posibles de devolver el bit i-th de un byte. El "primer bit" podría referirse al bit de orden superior o podría referirse al bit de orden inferior.

Aquí hay una función que toma una cadena e índice como parámetros y devuelve el valor del bit en esa ubicación. Como está escrito, trata el bit de orden inferior como el primer bit. Si desea primero el bit de orden superior, simplemente descomente la línea indicada.

def bit_from_string(string, index): i, j = divmod(index, 8) # Uncomment this if you want the high-order bit first # j = 8 - j if ord(string[i]) & (1 << j): return 1 else: return 0

La indexación comienza en 0. Si desea que la indexación comience en 1, puede ajustar el índice en la función antes de llamar a divmod .

Ejemplo de uso:

>>> for i in range(8): >>> print i, bit_from_string(''/x04'', i) 0 0 1 0 2 1 3 0 4 0 5 0 6 0 7 0

Ahora, por cómo funciona:

Una cadena se compone de bytes de 8 bits, así que primero usamos divmod () para dividir el índice en partes:

  • i : el índice del byte correcto dentro de la cadena
  • j : el índice del bit correcto dentro de ese byte

Usamos la función ord() para convertir el carácter en la string[i] en un tipo entero. Luego, (1 << j) calcula el valor del bit j-th desplazando a la izquierda 1 by j . Finalmente, usamos bitwise y para probar si ese bit está establecido. Si es así, devuelve 1, de lo contrario devuelve 0.


La unidad más pequeña con la que podrás trabajar es un byte. Para trabajar en el nivel de bits, necesita utilizar operadores a nivel de bits .

x = 3 #Check if the 1st bit is set: x&1 != 0 #Returns True #Check if the 2nd bit is set: x&2 != 0 #Returns True #Check if the 3rd bit is set: x&4 != 0 #Returns False


Lee los bits de un archivo, los bits bajos primero.

def bits(f): bytes = (ord(b) for b in f.read()) for b in bytes: for i in xrange(8): yield (b >> i) & 1 for b in bits(open(''binary-file.bin'', ''r'')): print b


No podrá leer cada bit uno por uno; debe leerlo byte por byte. Sin embargo, puede extraer fácilmente los bits:

f = open("myfile", ''rb'') # read one byte byte = f.read(1) # convert the byte to an integer representation byte = ord(byte) # now convert to string of 1s and 0s byte = bin(byte)[2:].rjust(8, ''0'') # now byte contains a string with 0s and 1s for bit in byte: print bit


Para leer un byte de un archivo: bytestring = open(filename, ''rb'').read(1) . Nota: el archivo se abre en modo binario .

Para obtener bits, convierta el bytestring en un entero: byte = bytestring[0] (Python 3) o byte = ord(bytestring[0]) (Python 2) y extraiga el bit deseado: (byte >> i) & 1 :

>>> for i in range(8): (b''a''[0] >> i) & 1 ... 1 0 0 0 0 1 1 0 >>> bin(b''a''[0]) ''0b1100001''


Suponiendo que tiene un archivo llamado bloom_filter.bin que contiene una matriz de bits y desea leer todo el archivo y usar esos bits en una matriz.

Primero crea la matriz donde se almacenarán los bits después de la lectura,

from bitarray import bitarray a=bitarray(size) #same as the number of bits in the file

Abra el archivo, usando abrir o con, cualquier cosa está bien ... Me quedo con abrir aquí,

f=open(''bloom_filter.bin'',''rb'')

Ahora carga todos los bits en la matriz ''a'' de una sola vez usando,

f.readinto(a)

''a'' es ahora un bitarray que contiene todos los bits


Uniendo algunas de las respuestas anteriores que usaría:

[int(i) for i in "{0:08b}".format(byte)]

Por cada byte leído desde el archivo. Los resultados para un ejemplo de 0x88 bytes son:

>>> [int(i) for i in "{0:08b}".format(0x88)] [1, 0, 0, 0, 1, 0, 0, 0]

Puede asignarlo a una variable y trabajar según su solicitud inicial. El "{0.08}" garantiza la longitud del byte completo.