Programación Web y Scripting > Python

 leer un fichero bit a bit

(1/2) > >>

DRiMeR:
Buenas. He estado guiándome todo el rato con la documentación de python, y a la hora de abrir, leer, desplazarme y cerrar ficheros legibles no he tenido ningún problema. Pero ahora querría hacer una cosa un poco diferente. Sería cuestión de ver los bits del fichero, porque son datos no legibles.

He visto en la documentación que el único parámetro que le puedo pasar al .read() es el número de bytes, pero a partir de ahí ya no he encontrado nada útil.

A ver si me podeís ayudar, ya sea diciendome como leer bit a bit, o bien cómo tratar los bytes y poder ver el contenido no legible que haya cargado desde el fichero.

La verdad es que siempre he querido aprender hacer esto desde que empecé a dar mis primeros pasos con C, pero nunca me puse a mirar bien cómo iba, y aunque supiera hacerlo en C ahora... no creo que me fuera de mucha ayuda :S


Un saludo.

DRiMeR:
Actalizo mi duda.

Creo que he conseguido "algo" xDD Lo que estoy intentando, en vez de leer bit a bit, es leer byte a byte, y hacer una conversion al byte para verlo como entero, y así podría sacar qué ceros y unos hay ahí, dentro del byte.

El código que tengo ahora mismo es el siguiente:



--- Código: Text ---import string def leebits(nombre):    #"nombre" es el nombre del fichero en cuestion    f = file(nombre, 'r')        n=0    f.seek(0,2)    tam = f.tell()    f.seek(0,0)    # en "tam" ya tengo el tamano en bytes del fichero para controlar cuando llego al final       while (f.tell() < tam):        b = f.read(1)  # leo un solo byte        print string.atoi(b,10)        print 'n'     print cuentabits("img.png") 
Teóricamente, estoy usando bien el método atoi, o al menos así es como yo entiendo que se usa. Aún así, no se me convierten bien a entero en base decimal. Si consiguiera hacer eso, el resto ya sería cuestión de convertir el número decimal a binario.

Es un proceso correcto, no?? A ver si voy a estar haciendo todo esto, y luego resulte que no funcione por algún motivo :S


Un saludo.

NRM:
podes probar con el código que esta a continuación.


--- Código: Python ---def binary(n):  """does not work on negative numbers! infinite loop"""  if(n < 0):    raise ValueError, "No definitive representation exists for negative integers"  out = ''  while(n):    out = str(n & 1) + out    n = n >> 1  return out if __name__ == "__main__":  print binary(0xff)  print binary(0xde)  print binary(0xad)  print binary(0x52)  print binary(0x11)  print binary(0x01) 
tal vez si nos pudieras explicar por que necesitas leer bit a bit podríamos ayudarte a solucionar el problema de otra manera.

saludos

nrm

DRiMeR:
Anda!! Más o menos comprendo ese código, y creo que eso es lo que buscaba (o parecido), pero lo tengo que probar en cuanto pueda (en este PC no está Python instalado).

Lo que pretendo leyendo el fichero bit a bit es hacer una pequeña parte de una aplicación que estoy escribiendo para Criptografía. Y en esta parte en concreto, lo que quiero hacer es leer un bit del archivo, y según sea 0 o 1, modificar el pixel de una imagen, o no modificarlo. Esto es básicamente para esconder esa información dentro de la imagen.

Entonces, lo que haré luego, es utilizar esta función confomre vaya leyendo bytes del archivo, y concatenar todos los valor que me devuelva para obtener una lista de todos los bits leidos.

Así luego me será más comodo, en vez de intentar hacerlo todo del tirón (aunque consumirá más memoria).


Luego os digo si me funciona. Gracias por la ayuda, NRM.

DRiMeR:
Pues a ver, ya he probado ese codigo, y lo he amoldado un poquito para que en vez de hacerme un string, me haga una lista ^^

Pongo el código aquí y comento un error que me da y no sé cómo meterle mano:



--- Código: Text ---#!/usr/bin/env python import string def aBinario(n):        if(n<0):                raise ValueError, "Entero negativo no valido"                out=''        while(n):                out = str(n & 1) + out                n = n >> 1                cad=[]        for i in range(len(out)):                cad.expand(out[i])                return cad  def leefich(nomfich):        f = file(nomfich, 'r')                n=0        f.seek(0,2)        tam = f.tell()        f.seek(0,0)        fich_cad=[]        while(f.tell()<tam):                b = f.read(1)                fich_cad.extend(aBinario(b))        return fich_cad  if __name__ == "__main__": datos = leefich('a.txt')print datos 
Eso me lanza el siguiente error en la línea 11:  TypeError: unsupported operand type(s) for &: 'str' and 'int'

Lo he intentado solucionar poniéndola así:


--- Código: Text ---out = str(int(n) & 1) + out 
He supuesto por el error que necesitaba que el operando fuera entero. Pero es que de esta forma me lanza este otro error: ValueError: invalid literal for int() with base 10: 'a'

Yo supongo que lo del 'a' será porque lo ha leido del fichero (a.txt solo contiene una a). Pero lo de la base 10... es que ya no sé que es eso, porque supuestamente, si le hago el casting a int, ya está en base 10, no??

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa