Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problemas al utilizar .decode() sobre bytearray #350

Open
7 tasks
Larraguibel opened this issue Nov 4, 2022 · 4 comments
Open
7 tasks

Problemas al utilizar .decode() sobre bytearray #350

Larraguibel opened this issue Nov 4, 2022 · 4 comments
Assignees
Labels

Comments

@Larraguibel
Copy link

Prerrequisitos

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

Hola holaa
Espero que se encuentren bien.
Quería pedirles si me pueden explicar que significa este error, pues llevo muucho rato pegado.

image

Lo que hice fue convertir el int 9035055081007070022067059069067 a bytes, obteniendo el siguiente bytearray:
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00r\t\xd6ew\xb3\xf9\xab\xd5\x84\xda\x90\x8b')

Lo que no comprendo, es porque falla al intentar usar decode sobre el bytearray.
Gracias de antemano :)

[Describe tu duda de manera detallada, explicando qué cosas aparecen en el enunciado y cuáles no]

[De ser necesario, coloca tu pregunta de manera explícita utilizando este formato]

@Larraguibel
Copy link
Author

Aprovecho de mencionar que esto ocurre independientemente de si convierte el int mediante int.to_bytes() con el endian "big" o "little"

@Hernan4444
Copy link
Contributor

Hola @Larraguibel

Lo que pasa es que usar int.to_bytes() no asegura que el bytes esté codificado en UTF-8, en cambio .decode() por defecto si asegura eso. Lo que recomiendo es siempre ser consistente con los métodos de codificación y decodificación.

  1. Si usar .decode() para decodificar, entonces se espera que hayas usado .encode() para codificar.
  2. Si usar int.to_bytes() para codificar, entonces se espera que uses int.from_bytes() para decodificar.

Siguiendo esa regla, no te debería aparecer problema. Aquí dejo un ejemplo usando el segundo caso

numero = 2198372913721
codificacion = int.to_bytes(numero, length=20, byteorder="big")
print(codificacion) # b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xd9<\x929'
decodificacion = int.from_bytes(codificacion, byteorder="big")
print(decodificacion) # 2198372913721
print(decodificacion == numero) # True

Espero que esto resuelva tu problema, sino estamos atentos al foro,
Saludosヾ(^-^)ノ

@Hernan4444 Hernan4444 self-assigned this Nov 5, 2022
@Larraguibel
Copy link
Author

Larraguibel commented Nov 5, 2022

Ahí encontré el error! Muchas gracias. Mi problema era el punto 1, porque nunca hago .encode() al mensaje. Aun así me queda una duda.
Tomando el byte que se da como ejemplo en la parte de encriptación, es decir byte = b’\x05\x08\x03\x02\x04\x03\x05\x09\x05\x09\x01’

Si quiero devolver esos bytes a su forma original (sea el formato que sea), ¿Cómo puedo hacerlo? Los únicos métodos que conozco para deserializar son json.loads y .decode(), y ninguno funciona. San google tampoco me ha dado más opciones jeje.
Gracias!

@Hernan4444
Copy link
Contributor

Hola,

No vas a poder volver a su forma original, porque nunca existió una forma original. Nosotros inventamos esa secuencia de bytes para ejemplificar la parte de encriptación (desordenar los bytes para que nadie vea su contenido) y desencriptación (reordenar los bytes para ver su contenido). Pero la parte de codificación (mensaje a bytes) y decodificación (bytes a mensaje) no la hicimos porque depende del estudiante decidir cómo hacer esa parte (json + encode o pickle).

Por lo tanto, San Google tampoco encontrará la respuesta porque no existe 😅.

Saludosヾ(^-^)ノ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants