85 votes

Convertir un int Python en une chaîne d'octets big-endian

J'ai un int non négatif et je voudrais le convertir efficacement en une chaîne big-endian contenant les mêmes données. Par exemple, l'int 1245427 (qui correspond à 0x1300F3) doit générer une chaîne de longueur 3 contenant trois caractères dont les valeurs d'octet sont 0x13, 0x00 et 0xf3.

Mes droits sont à l’échelle des 35 (base 10) chiffres.

Comment puis-je faire cela? Merci.

73voto

Janus Troelsen Points 5121

Dans Python 3.2+, vous pouvez utiliser int.to_bytes :

Si vous ne voulez pas spécifier la taille

 >>> my_number = 1245427
>>> (my_number).to_bytes((my_number.bit_length() // 8) + 1, byteorder='big')
b'\x13\x00\xf3'
 

Si cela ne vous dérange pas de spécifier la taille

 >>> (1245427).to_bytes(3, byteorder='big')
b'\x13\x00\xf3'
 

67voto

Ayman Hourieh Points 39435

Vous pouvez utiliser le module struct :

 import struct
print struct.pack('>I', your_int)
 

'>I' est une chaîne de format. > signifie big endian et I signifie unsigned int. Consultez la documentation pour plus de caractères de format.

15voto

pts Points 15396

Ceci est rapide et fonctionne pour les petits et les grands (arbitraires):

 def Dump(n): 
  s = '%x' % n
  if len(s) & 1:
    s = '0' + s
  return s.decode('hex')
print repr(Dump(1245427))  #: '\x13\x00\xf3'
 

11voto

Ben Hoyt Points 2719

Probablement la meilleure façon est via le struct module:

>>> import struct
>>> x = 1245427
>>> struct.pack('>BH', x >> 16, x & 0xFFFF)
'\x13\x00\xf3'
>>> struct.pack('>L', x)[1:]  # could do it this way too
'\x13\x00\xf3'

Sinon, -- et je ne serait pas l'habitude de recommander cette, parce que c'est erreur sujettes -- vous pouvez le faire "manuellement" par le déplacement et l' chr() fonction de:

>>> x = 1245427
>>> chr((x >> 16) & 0xFF) + chr((x >> 8) & 0xFF) + chr(x & 0xFF)
'\x13\x00\xf3'

Par curiosité, pourquoi vous voulez seulement trois octets? Généralement vous pack un tel entier en 32 bits (un C unsigned long), et l'utilisation struct.pack('>L', 1245427) mais ignorer l' [1:] étape?

7voto

Alex Martelli Points 330805
def tost(i):
  result = []
  while i:
    result.append(chr(i&0xFF))
    i >>= 8
  result.reverse()
  return ''.join(result)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X