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

Semana 11, ejercicio propuesto 1.1 #286

Closed
5 tasks done
Francisco-Aguilera-xd opened this issue Nov 16, 2021 · 8 comments
Closed
5 tasks done

Semana 11, ejercicio propuesto 1.1 #286

Francisco-Aguilera-xd opened this issue Nov 16, 2021 · 8 comments

Comments

@Francisco-Aguilera-xd
Copy link

Hola!
No entiendo muy bien como se realiza este ejercicio, porque se nos pide que a partir de un chunk de 8 bytes, se saque una lista de número. Revisando el jupyter de contenidos de la semana, no encuentro ningun comando que convierta los bytes a enteros como una lista. En la ayudantía de hoy una ayudante usó el comando int.from_bytes pero este entregaba solo un número, por lo que tampoco cacho como lograr obtener 8 números separados. ¿Alguna ayuda de como se hace este ejercicio?
Gracias de antemano

@carmebe
Copy link

carmebe commented Nov 16, 2021

Hola, no sé a qué te refieres con convertir los bytes a enteros como una lista, lo único que se te pide en ese ejercicio es obtener los chunks de 8 bytes, eliminar todos los valores que sean máximos del chunk (puedes intentarlo con un while) y reconstruir el archivo agregándolos a un bytearray, tal como se había visto en los contenidos. Recuerda que puedes utilizar los métodos de listas o strings con los bytearrays también (ver su máximo, extenderlas, obtener su índice, etc.)

Espero que te haya servido, saludos!

@Francisco-Aguilera-xd
Copy link
Author

Es que cuando trato de leer los bytes, no me aparece ningún número, me sale solo hexaecimales. Me printea algo como lo siguiente el .read()

b'BM\xba\xfb\xdd\xfb\x01\x00\xfe\x00\x00\xfe\x00\x006\x00\xff\xff\x00\x00(\x00\x00\x00\xfa\xf4\x00\x00\x00\xa7\xfa\x00\x00\xfd\x00\x01\x00\x18\xfd\x00\x00\x00\xfa\x00\xfa\x00\x00\x00\x00\x00\xc4\x0e\xfd\xfd\x00\x00\xc4\x0e\x00\x00\xfb\x00\xfb\x00\x00\xfd\x00\xfd\x00\x00\x00\x00X\xfbXXXX\xfbXX\xfc\xfcXXXXXXX\xff\xffXXXXXX\xfcX\xfcXXXXXX\xffXX\xffXXX\xfc\xfcXXXXXXX\xffXX\xffXX\xfaX\xfaXXXXXX\xffXX\xffXXXX\xfdXXX\xfdX\xfdXXXX\xfdXXXXX\xfeXX\xfeX\xfb\xfbXXXXXXXXX\xfc\xfcXXXX\xfdXX\xfdXXX\xfdXXX\xfdXXXXX\xfbX\xfbXXXX\xfbXXXX\xfbXXX\xfaX\xfaXXXX\xfcXXXX\xfcX\xfaXXXXX\xfaXXX\xfcXX\xfcXXXXXXX\xff\xffXX\xfd\xfdXXXXX\xfd\xfdXXXXXX\xfeX\xfeXXXXXXXXX\xfa\xfaXXXXXXX\xfc\xfcXXXXX\xff\xffXXX\xfb\xfbXXXXXXXXX\xffX\xffXXXX\xfeXX\xfeXX\xfbX\xfbXXXXXXXXX\xfa\xfaX\xfd\xfdXXXXXXXXXX\xfa\xfaXX\xfdXX\xfdXXXX\xfeXX\xfeXXXX\xfdXXX\xfdXXXXXXXX\xfc\xfcX\xfbX\xfbXXXXXXXXX\xfdX\xfdXXXX\xfb\xfbXXX\xfe\xfeXXXXXXX\xfd\xfdXXXXXXXX\xfa\xfaXXXXXX\xfe\xfeXXXXX\xfcXXX\xfcXXXXX\xfdX\xfdXXX\xfdX\xfdXXXXXX\xfaXX\xfaXXXXX\xfbX\xfbXXXXX\xfcX\xfcXXXX\xfbX\xfbXX\xfdXX\xfdXXXXXXXX\xfb\xfbXX\xfaXXXX\xfaXX\xfeXXX\xfeXXX\xfe\xfeXXXXXX\xfb\xfbXXXXXX\xfaXX\xfaXXXXXXXXX\xfd\xfdXXX\xfe\xfeXXXXXXXX\xffX\xffXX\xfbXX\xfbXXXXXX\xfd\xfdXXXXXX\xfd\xfdXXX\xffXXXX\xffXXX\xfbXX\xfbXXXXXXX\xfbX\xfbXXX\xfeXX\xfeXXXX\xfaXX\xfaXXX\xfeXXX\

@carmebe
Copy link

carmebe commented Nov 17, 2021

Hola, si te interesa ver esos valores como una lista de números, los cuales es opcional, prueba a usar print en el for para obtener los chunks de esta manera:

print([byte for byte in chunk])

Con opcional me refiero a que no necesitas trabajar con estos números, ya que puedes encontrar el máximo de un bytearray directamente. Recuerda que cuando imprimes un byte, lo que se muestra es el código ascii del carácter usado (puedes notar ahí que hay letras en mayúscula que tienen un cierto código, y otros que son hexadecimales que también tienen su propio código)

@try-except
Copy link

Hola! Esos hexadecimales que te aparecen sí son números, solo que en su representación hexadecimal. Cuando lees un archivo en modo read bytes (con rb en el open), el método read() retorna un string de bytes, que puedes identificar por esa b al inicio del string. Una vez obtenido el string de bytes, puedes iterar sobre él en chunks.

Es fácil confundirse cuando aparecen los hexadecimales, pero recuerda que cada byte está compuesto por 8 bits, osea que imprimir 10 bytes resultaría en 80 caracteres, así que como un archivo está compuesto por muchos bytes, imprimir cada uno de los bits sería larguísimo y muy incómodo. Para evitar llenar tu terminal de 1 y 0, se usa la representación hexadecimal, que no es más que una forma un poco más compacta de representar lo mismo.

@Francisco-Aguilera-xd
Copy link
Author

Wena, ahí si los veo como números. Entonces en los bytes cada "caracter" es un haxadecimal?. O sea los caracteres de xba\xfb\xdd\xfb son xba, xfb..... y no son "x, b, a, x, f, b......" ?

@carmebe
Copy link

carmebe commented Nov 17, 2021

Los \xba, \xfb, etc. son representaciones hexadecimales de números, puedes intentar lo siguiente para comprobarlo:

num = b'\xba'
print(int.from_bytes(num, byteorder="little"))  # big también sirve

El prefijo \x** corresponde a una notación hexadecimal, en donde se trabaja con valores del 0 al 9 y de la a (10) hasta la f (15) con base 16. Esta notación es no más para poder trabajar con números más grandes, y hay muchas otras formas de representarlas, pero Python prefiere trabajarlas de esta manera. Puedes averiguar en internet las otras formas en que pueden ser representados los números.

@try-except
Copy link

try-except commented Nov 17, 2021

Entonces en los bytes cada "caracter" es un haxadecimal?.

Un byte es un conjunto de 8 bits, por ejemplo:

10010110

Los bits son de base 2, es decir que cada dígito representa una potencia de 2, el byte anterior es equivalente al número 150 en base 10 ¿Te fijas que usé solo 3 dígitos en base 10 para representar exactamente lo mismo? Hay formas más compactas de representar el mismo número, como por ejemplo el hexadecimal, que usa base 16. El único objetivo de representar en base 16 es hacer más legibles los bytes del archivo. Para lograr tener 16 dígitos posibles, usamos los números de 0-9 y las letras de la "a" a la "f", por eso aparecen las letras. Python indica que el número que está mostrando es un hexadecimal con el prefijo \x, lo que sigue al prefijo es realmente el número.

A modo de ejemplo, el hexadecimal \xfe es igual a 254:

0 1 2 3 4 5 6 7 8 9 a b c d e f

f = 15, e = 14
16^1 * 15 + 16^0 * 14 = 240 + 14 = 254

Así que respondiendo a tu pregunta, en los bytes cada byte puede ser representado como un hexadecimal. Entonces \xba\x12\x00 son 3 bytes, porque tengo tres prefijos \x.
Te recomiendo no enredarte demasiado con los hexadecimales porque al final del día python se encarga de manejarlos por ti en la mayoría de los casos, piensalos como una representación más compacta solamente :)

@Francisco-Aguilera-xd
Copy link
Author

Ahhhh ya, ahora me queda mucho más claro. Muchísimas gracias a ambos.

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

No branches or pull requests

3 participants