Ce que vous devez faire, c'est convertir l'int/long dans sa représentation en base 256 -- c'est-à-dire un nombre dont les "chiffres" vont de 0 à 255. Voici un moyen assez efficace de faire quelque chose comme ça :
def base256_encode(n, minwidth=0): # int/long to byte array
if n > 0:
arr = []
while n:
n, rem = divmod(n, 256)
arr.append(rem)
b = bytearray(reversed(arr))
elif n == 0:
b = bytearray(b'\x00')
else:
raise ValueError
if minwidth > 0 and len(b) < minwidth: # zero padding needed?
b = (minwidth-len(b)) * '\x00' + b
return b
Vous n'avez souvent pas besoin du reversed()
en fonction du caractère endian souhaité (ce qui nécessiterait que le remplissage soit également effectué différemment). Notez également que tel qu'il est écrit, il ne gère pas les nombres négatifs.
Vous pouvez également jeter un coup d'œil sur le site similaire mais hautement optimisé de long_to_bytes()
dans le number.py
qui fait partie de l'application open source Boîte à outils de cryptographie Python . Il convertit en fait le nombre en une chaîne de caractères, et non en un tableau d'octets, mais c'est un problème mineur.
0 votes
Je ne suis pas sûr que cela puisse vous aider, mais vérifiez la section
struct
module : docs.python.org/library/struct.html