Question

Je travaille sur un programme dans lequel je stocke des données dans un entier et les traite au niveau du bit. Par exemple, je pourrais recevoir le numéro 48, que je traiterai bit par bit. En général, l’endianité des entiers dépend de la représentation des entiers sur la machine, mais Python fait-il quelque chose pour garantir que les ints seront toujours de petite taille? Ou dois-je vérifier l’endianisme comme je le ferais en C, puis écrire un code séparé pour les deux cas?

Je le demande parce que mon code fonctionne sur une machine Sun et que, même si celle sur laquelle il tourne actuellement utilise des processeurs Intel, il se peut que je devrais passer ultérieurement à une machine dotée de processeurs Sun, ce qui, à mon avis, est big-endian.

Était-ce utile?

La solution

Le int de Python a la même finalité que le processeur sur lequel il est exécuté. Le module struct vous permet de convertir des octets blobs en octets (et viceversa, et certains autres types de données aussi) de manière native, little-endian ou big-endian, selon le chaîne de formatage que vous choisissez: démarrez le format avec @ ou n'utilisez aucun caractère de finalité pour utiliser l'endianité native (et les tailles natives - tout le reste utilise des tailles standard), ' ~ 'pour natif,' < ' pour le petit boutien, '>' ou '!' pour big-endian.

Ceci est octet par octet, pas bit par bit; Vous ne savez pas exactement ce que vous entendez par traitement, étape par étape, dans ce contexte, mais je suppose que cela peut se faire de la même manière.

Pour rapide " en vrac " Dans des cas simples, considérez également le module array - le fromstring et tostring peuvent rapidement opérer sur un grand nombre d'octets, et la méthode byteswap peut vous obtenir "l'autre". endianness (natif à non natif ou vice versa), à nouveau rapidement et pour un grand nombre d’éléments (l’ensemble du tableau).

Autres conseils

Si vous devez traiter vos données bit à bit, la chaîne de caractères module pourrait vous être utile. Il peut également gérer l’endianisme entre les plates-formes (du moins sur la dernière version du tronc, à paraître dans les prochains jours).

Le module struct est la meilleure méthode standard de traiter de l’endianisme entre les plates-formes. Par exemple, cela compresse et décompresse les entiers 1, 2, 3 en deux "shorts" et un "long" (2 et 4 octets sur la plupart des plateformes) en utilisant l’endianness natif:

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)

Pour vérifier l’endianité de la plate-forme par programmation, vous pouvez utiliser

>>> import sys
>>> sys.byteorder

qui renverra "gros" ou "petit" .

Vérifiez quand?

Lorsque vous effectuez des opérations au niveau des bits, l'int in aura la même finalité que les ints que vous avez insérés. Vous n'avez pas besoin de vérifier cela. Vous devez vous en préoccuper uniquement lors de la conversion de / vers des séquences d'octets, dans les deux langues, autant que je sache.

En Python, vous utilisez le module struct pour cela, le plus souvent struct.pack () et struct.unpack ().

L'extrait suivant vous indiquera si le système par défaut est little endian (sinon, c'est big-endian)

import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)

Notez cependant que cela n’affectera pas le comportement des opérateurs au niveau des bits: 1 < < 1 est égal à 2 quelle que soit la finalité par défaut de votre système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top