Lunes 23 de Diciembre de 2024, 05:06
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Web y Scripting
»
Python
(Moderador:
arielb
) »
leer un fichero bit a bit
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: leer un fichero bit a bit (Leído 5889 veces)
DRiMeR
Nuevo Miembro
Mensajes: 22
leer un fichero bit a bit
«
en:
Viernes 24 de Abril de 2009, 19:08 »
0
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.
Tweet
DRiMeR
Nuevo Miembro
Mensajes: 22
Re: leer un fichero bit a bit
«
Respuesta #1 en:
Sábado 25 de Abril de 2009, 12:17 »
0
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
Miembro MUY activo
Mensajes: 279
Nacionalidad:
Re: leer un fichero bit a bit
«
Respuesta #2 en:
Lunes 27 de Abril de 2009, 05:10 »
0
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
Nuevo Miembro
Mensajes: 22
Re: leer un fichero bit a bit
«
Respuesta #3 en:
Lunes 27 de Abril de 2009, 09:21 »
0
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
Nuevo Miembro
Mensajes: 22
Re: leer un fichero bit a bit
«
Respuesta #4 en:
Lunes 27 de Abril de 2009, 10:37 »
0
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??
RadicalEd
Moderador
Mensajes: 2430
Nacionalidad:
Re: leer un fichero bit a bit
«
Respuesta #5 en:
Lunes 27 de Abril de 2009, 14:17 »
0
Lo que quieres pegarle es a la esteganografía, revisa este post, está muy bueno y sencillo de entender.
Esteganografía
El pasado son solo recuerdos, el futuro son solo sueños
DRiMeR
Nuevo Miembro
Mensajes: 22
Re: leer un fichero bit a bit
«
Respuesta #6 en:
Lunes 27 de Abril de 2009, 16:25 »
0
Sí, está bien ese script. Pero lo que hace es abrir dos imágenes para tocarlas e introducir una en la otra. A mí lo que me interesa es meter otro tipo de información binaria, que ni si quiera tenga por qué ser texto. He ahí la necesidad de operar a nivel de bits.
DRiMeR
Nuevo Miembro
Mensajes: 22
Re: leer un fichero bit a bit
«
Respuesta #7 en:
Lunes 27 de Abril de 2009, 19:16 »
0
Hola otra vez. Por fin lo he conseguido! Ya he conseguido pasar cualquier cosa a binario. Tal y como lo estaba haciendo, me servía sólo para caracteres, porque el
string.atoi
admite sólo bases desde 2 hasta 36, así que aunque me hubiera conformado con leer archivo que contuvieran texto, los símbolos (?, =, !, etc..) me hubieran fastidiado. El código me ha quedado así:
Código: Text
def aBinario(n):
if(n<0):
raise ValueError, "Entero negativo no valido"
cad=[]
b=struct.unpack('B', n)
b=b[0]
for i in range(8):
cad.append(b & 1)
b = b >> 1
return cad
El truco está en el
unpack
, y en que me lo convierte de forma que en vez de devolvermelo como una lista normal, he tenido que coger el primer elemento, que es donde pone el elemento convertido en forma de lista.
Muchas gracias por vuestra ayuda, como veis en el código, me ha ayudado bastante tener el código de NRM como guía (no tenía ni idea de que existiera el
>>
para mover los bits). Cuando termine la aplicación la colgaré por aquí
Un saludo.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Web y Scripting
»
Python
(Moderador:
arielb
) »
leer un fichero bit a bit