IIC2233 / Syllabus-2023-1

75 stars 44 forks source link

Error pickle.loads al decodificar #454

Open pulpaulaa opened 1 year ago

pulpaulaa commented 1 year ago

Prerrequisitos

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

Duda

Hola, tengo un problema que no logro entender al decodificar un mensaje. Estoy usando strings como mensajes, y pickle para pasarlo a bytes. Cripto.py funciona bien, y no he tenido problemas serializando con pickle.dumps en la codificación, pero al usar pickle.loads para deserializar, me sale el error "_pickle.UnpicklingError: pickle data was truncated" (con mensajes cortos no hay problema, los largos son los que tiran ese error). En la carpeta de mi tarea, en mi repositorio, subí un archivo que se llama prueba.py que lo hice para revisar esto sin tener que correr todo el código de la tarea (solo tiene lo de la codificación y encriptación, simulando el envio y recibo de un mensaje simple). En la parte del inicio dejé algunos mensajes de prueba, los cortos deberían funcionar y el largo no. Estaría muy agradecida si alguien lo puede revisar para entender cuál es el problema :(

vicente999 commented 1 year ago

Hola! El error '_pickle.UnpicklingError: pickle data was truncated' se puede dar porque la información que estas entregando es > 4096 y solo haces pickle a una parte de la información (no completa). Lo que puedes hacer para arreglarlo es decodificar el mensaje por partes y luego unificarlo todo en una nueva variable, te recomiendo ver este link.

pulpaulaa commented 1 year ago

@vicente999 Entiendo, revisé el link y ahora intenté hacer algo así pero me sigue dando el mismo error. Justo después de desencriptar intenté separar el mensaje para decodificar por partes pero por ejemplo en este código intenté literal ir de a 1 byte (usando .to_bytes porque al usar [i] se transforma a int) y aún así la linea de pickle.loads me tira el mismo error. Un ejemplo de esa parte:

msg_nuevo = []
for i in range(len(msg_desencriptado)):
    pedazo = msg_desencriptado[i].to_bytes(1, "big")
    pedazo = pickle.loads(pedazo)
    msg_nuevo.append(pedazo)
msg_nuevo = "".join(msg_nuevo)
pulpaulaa commented 1 year ago

@vicente999 Logré resolverlo usando encode y decode en vez de dumps y loads, pero no sé si es legal, se puede hacer eso?