IIC2233 / Syllabus-2023-1

75 stars 44 forks source link

Ejercicios propuestos semana 11 ejercicio 1 #414

Open monesti opened 1 year ago

monesti commented 1 year ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Holaaa 🌊 Buen día ☁️ . Esperando que se encuentren bien, vengo a consultar sobre el funcionamiento de mi código. La verdad no entiendo muy bien porque no funciona correctamente. Obtengo el máximo con la función max() y luego la serializo para así posteriormente utilizar el método replace que elimne los bytes indeseados. Guardo lo que obtengo en una lista y luego escrito en el archivo pero a la hora de tratar visualizarlo me dice que el formato no es compatible.

Muchas graacias de antemano 😄 y espero que no sea una duda tan terrible.

saludos y buen miércoles👋

PD: (En la línea 9 utilicé enconde en vez de dumps para ver como cambiaba el comportamiento y al no ver cambio lo dejé así. Es algo que todavía no entiendo muy bien pero estoy trabajando en ello 😅 )

import pickle
with open("malvado.mal", "br") as archivo:
    chunks = 8
    linea = bytearray(archivo.readline())
    lista =[]
    for i in range(0, len(linea), chunks):
        chunk = bytearray(linea[i: i + chunks])
        maximo = pickle.dumps(max(chunk)) 
        chunk = chunk.replace(maximo, "".encode())
        lista.append(chunk)
    with open("simpatico.bmp", "bw") as respuesta:
        for i in lista:
            print(i)
            pickle.dump(i, respuesta)
Hernan4444 commented 1 year ago

Hola @monesti

Viendo el código hay 2 temas importantes:

  1. La eliminación del máximo no funciona, porque ahí estás intentando trabajar esto como un string, pero al final los bytearray son una lista de números, solo que esos números están guardados en otro formato. Te recomiendo pensar que chunk es una lista de números y programar un argorirmo que elimine el número más grande de dicha lista, sin recurrir a dumps, replace, etc.
  2. Por otro lado, cuando guardas, pickle.dump guarda literalmente lo que le pases. Sii` es un bytearray, va a guardar literalmente un objeto bytearray con su contenido. Por ejemplo, si el archivo resultando debería ser la concatenación de los siguientes 2 bytearray:

    bytearray(b'\x00\xfbXXXX\xfbX') + bytearray(b'\x00\xfc\xfcXXXXX')

    Adentro del archivo debería estar: b'\x00\xfbXXXX\xfbX\x00\xfc\xfcXXXXX'

    Pero con tu algoritmo, el archivo se vería algo así bytearray(b'\x00\xfbXXXX\xfbX')bytearray(b'\x00\xfc\xfcXXXXX')

Intenta darle una vuelta a tu código en función de estos 2 comentarios. Y como tip, el archivo resultante es el mismo que "imagen.bmp" (para que sepas bien cuando llegas al resultado).

Saludosヾ(^-^)ノ