Dado un número entero N , la tarea es escribir un programa en Python para representar los bytes de este número como una array.
Un byte es un grupo de 8 bits. Cualquier número entero se puede representar en forma de bytes y bits. Generalmente usamos códigos hexadecimales para representar un byte. Un solo carácter hexadecimal puede representar 4 bits, por lo que se utilizan un par de caracteres hexadecimales para representar un byte.
Ejemplo:
Entrada: N = 543
Salida: [‘0x2’, ‘0x1f’]
Explicación: 543 se puede representar como 1000011111 en binario que se puede agrupar como (10)(00011111), cada grupo representa un byte. En forma hexadecimal, este número será (0x02)(0x1F).
Entrada: N = 17292567
Salida: [‘0x1’, ‘0x7’, ‘0xdd’, ‘0x17’]
Explicación: 17292567 se puede representar como 1000001111101110100010111 en binario que se puede agrupar como (1)(00000111)(11011101)(00010111), cada grupo representa un byte. En forma hexadecimal, este número será (0x1), (0x7), (0xdd), (0x17).
Método 1 (Conversión manual):
Al igual que convertimos números decimales a números binarios, podemos convertirlo en un número de base 256 que nos dará números de 8 bits que representan bytes para el número dado.
A continuación se muestra el código para implementar el método mencionado anteriormente:
Python3
n = 17292567 # Initialize the empty array array = [] # Get the hexadecimal form while(n): r = n % 256 n = n//256 array.append(hex(r)) # Reverse the array to get the MSB to left array.reverse() print(array)
['0x1', '0x7', '0xdd', '0x17']
Método 2 (usando el método to_bytes() ):
También podemos usar el método to_bytes(longitud,orden de bytes) para convertir el número en una string hexadecimal. Pero el problema con esta función es que durante la impresión, los códigos hexadecimales pueden convertirse a sus caracteres correspondientes en el esquema de codificación ASCII. Para superar esto, podemos usar el método hex() sobre este método. Toma dos argumentos, ‘ longitud ‘ es el tamaño de la array y ‘ orden de bytes ‘ es el orden de los bytes donde » grande» significa que el MSB estará a la izquierda y » pequeño» significa que el MSB estará a la derecha.
A continuación se muestra el código para implementar el método mencionado anteriormente:
Python3
import math n = 543 # Calculate the length of array size = int(math.log(n, 256))+1 # Use the method to_bytes() with "big" # or "little" property We need to apply # hex() method to avoid the conversion # into ASCII letters hexForm = n.to_bytes(size, "big").hex() # Append 8 bits together ie pair of 4 bits to get a byte array = [] for i in range(0, len(hexForm), 2): array.append('0x'+hexForm[i]+hexForm[i+1]) print(array)
['0x02', '0x1f']
Método 3 (usando comandos de formato de string):
En Python, hay un comando de string «%x» que puede convertir el entero dado en formato hexadecimal. Podemos usar esto para obtener el resultado deseado.
A continuación se muestra el código para implementar el método mencionado anteriormente:
Python3
n = 8745 # Get string representation of hex code hexcode = "%x" % n # Pad an extra 0 is length is odd if len(hexcode) & 1: hexcode = "0"+hexcode array = [] for i in range(0, len(hexcode), 2): array.append('0x'+hexcode[i]+hexcode[i+1]) print(array)
['0x22', '0x29']
Publicación traducida automáticamente
Artículo escrito por mukulbindal170299 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA