domingo, 27 de mayo de 2012

Un correo esotérico, parte 1

Habiendo mencionado un poco sobre la lectura/escritura de archivos de texto, les puedo proponer un simpático problema de programación que pueden resolver utilizando los conocimientos de Python que se han dado hasta ahora en este blog.

Un amigo mío me mando un día el siguiente correo:

:
:
:

El correo original consta de 22 páginas de ... ¡ceros y unos!  Pueden descargar el archivo de texto con la secuencia de dígitos binarios en este enlace.  La misión de ustedes será hacer un script en Python para "decifrar" esta secuencia de ceros y unos.  Quiero que observen lo siguiente:
  • Los ceros y unos están agrupados en grupos de 8 bits (cifras binarias).
  • Cada grupo de 8 bits seguramente representa algo... ¿Una letra o un caracter?
  • ¿Cómo representámos caracteres y letras en un computador? ¿Cuál sistema de codificación se usa más frecuentemente?
Traten de decifrar el mensaje antes de que yo publique el script para decifrarlo como siguiente entrada de este blog.




4 comentarios:

  1. #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    def conversion(cadena):
    pos=7
    valor_decimal=0
    for subcadena in cadena:
    if subcadena == '1':
    valor_decimal=valor_decimal+2**(pos)
    pos=pos-1
    return valor_decimal

    mensaje=""
    archivo= open("mensaje.txt","r")
    while True:
    dato_ext=archivo.read(8)
    if dato_ext!="":
    archivo.seek(1,1)
    decimal=conversion(dato_ext)
    mensaje+=chr(decimal)
    if dato_ext=="":
    break
    print mensaje

    ResponderEliminar
  2. Buenas noches Prof, y buenas noches muchachos, mi codigo es de la siguiente forma, aunq la salida no me convence, de todas formas, si me pueden corregir en algo, agradecido estoy ok. MI codigo es este:

    #creando un archivo de lectura del binario y de escritura del ASCII
    f=open("leo.txt","r")
    d=open("caracter.txt","w")

    #convirtiendo los binarios a caracteres ASCII
    p=1
    valor=f.read(1)
    while valor!="":
    e=[]
    k=0
    while k<7:
    e.append(valor)
    valor=f.read(1)
    k=k+1
    #convirtiendo el binario en decimal
    cont=7
    acum=0
    for l in e:
    if l=="1":
    acum=acum+(2**cont)
    cont=cont-1
    #convirtiendo el valor decimal en caracter ASCII
    y=chr(acum)
    #archivando los caracteres
    if p%8==0:
    d.write(y)
    d.write("\n")
    else:
    d.write(y)
    d.write(" ")
    valor=f.read(2)
    p=p+1

    #cerrando los archivos pendientes
    f.close()
    d.close()

    #mostrando el msj:
    d=open("caracter.txt","r")
    msj=d.read()
    print "Su mensaje en caracteres ASCII es:\n",msj
    d.close()

    ResponderEliminar
  3. Hola muchachos:

    En primer lugar, los scripts que puiblicaron no aparecen indentados. Supongo que originalmente sí lo estan, porque sino jamás van a correr...

    Quisiera hacerles algunas observaciones sobre sus bloques de iteracion (while, for, etc.):

    * Cuando uds. saben de antemano cuantas veces van a iterar por un ciclo, es mejor usar un for y no un while. Esto lo digo en el caso de Leober, quien usa un while para decifrar palabras de 8 bits.
    * El uso del "break" para interrumpir un while, aunque es legal, es una abominación, desde el punto de vista de la programación estructurada. ¿Quizás fueron malacostumbrados por C?

    Si observan el archivo de texto original con el mensaje encriptado en ceros y unos, se darán cuenta que las palabras de 8 bits siempre van separadas por un espacio. En el código de Leober, veo que no se está tomando en cuenta esta separación.

    Si quieren hacer su código más eficiente, averiguen si existe alguna función incorporada en python que les permita convertir cadenas que representan numeros binarios (o decimales o de cualquier base) a los valores numéricos correspondientes. Investiguen sobre int ...

    ResponderEliminar
  4. #!/usr/bin/env python
    # -*- coding: utf-8 -*-


    def conversion(cadena):
    pos=7
    valor_decimal=0
    for subcadena in cadena:
    if subcadena == '1':
    valor_decimal=valor_decimal+2**(pos)
    pos=pos-1
    return valor_decimal


    mensaje=""
    a=True
    archivo= open("mensaje.txt","r")
    while a==True:
    dato_ext=archivo.read(8)
    if dato_ext!="":
    archivo.seek(1,1)
    decimal=conversion(dato_ext)
    mensaje+=chr(decimal)
    if dato_ext=="":
    a=False
    print mensaje

    ResponderEliminar