Endianness d'entiers en Python
Je suis en train de travailler sur un programme où je stocker des données dans un nombre entier et de le traiter au niveau du bit. Par exemple, je pourrais recevoir le numéro 48, que je vais le processus de bit-par-bit. En général, le stockage des entiers dépend de la représentation machine des nombres entiers, mais Python ne rien faire pour garantir que les services de renseignements sera toujours little-endian? Ou dois-je besoin de vérifier l'endianness comme je le ferais dans C, puis d'écrire de code distinct pour les deux cas?
Je demande parce que mon code fonctionne sur un Sun machine et, bien que l'un il est en cours d'exécution sur utilise maintenant des processeurs Intel, je pourrais avoir à passer à une machine avec le Soleil processeurs dans l'avenir, je sais, c'est big-endian.
OriginalL'auteur G Gordon Worley III | 2009-09-09
Vous devez vous connecter pour publier un commentaire.
Python
int
a la même endianness comme le processeur, il fonctionne sur. Lestruct
module vous permet de convertir des octets gouttes à ints (et vice-versa, et de certains autres types de données) en natif, little-endian ou big endian façons, selon la chaîne de format à vous de choisir: démarrer le format avec@
ou pas endianness caractère à utiliser natif endianness (et natif de tailles, tout le reste utilise des tailles standard), '~' pour les natifs, '<' pour little-endian, '>' ou '!' pour big-endian.C'est-octet par octet, pas de bit-par-bit; vous ne savez pas exactement ce que tu veux dire par bit-à-bit de traitement dans ce contexte, mais je suppose que ça peut être accueilli de la même façon.
Rapide "en vrac" de traitement dans les cas simples, de prendre aussi en considération la tableau module -- le
fromstring
ettostring
méthodes peuvent fonctionner sur un grand nombre d'octets rapidement, et labyteswap
méthode, vous pouvez obtenir en "l'autre", endianness (natif de non-indigènes ou vice versa), rapidement et pour un grand nombre d'éléments (toute la gamme).vous êtes le dessin complètement injustifiée des déductions à partir de votre observation -- 0x0001 est juste une étrange redondant hexadécimal pour entier
1
, rien à voir avec la représentation interne!ouais merci, je l'ai mélangé avec de ce. Il semble juste être une HEXSTRING d'un entier.
Qu'en notation binaire, si?
0b10000001101
va ce donner le numéro 1037 sur tous les systèmes et les versions de Python?OriginalL'auteur Alex Martelli
Si vous avez besoin de traiter vos données "bit à bit", puis le
bitstring
module peut être vous aider. Il peut également traiter de l'endianness entre les plates-formes (sur la dernière tronc construire au moins à être publié dans les prochains jours).La
struct
module est la meilleure méthode standard de traiter avec l'endianness entre les plates-formes. Par exemple ce packs et décompresser les entiers 1, 2, 3 en deux "courts métrages" et une "longue" (2 et 4 octets sur la plupart des plates-formes) à l'aide de native endianness:Pour vérifier le boutisme de la plate-forme par programmation, vous pouvez utiliser
qui renvoie
"big"
ou"little"
.En général, vous ne pouvez pas dire. Pour désosser un format de fichier inconnu vous pourriez regarder les données et devinez quelle est la taille/l'endianness fait le plus de sens. Pour illustrer, si vous déballer mon exemple avec le mauvais stockage, vous obtenez (256, 512, 50331648) au lieu de (1, 2, 3) qui est raisonnable idée que vous avez eu tort...
OriginalL'auteur Scott Griffiths
Vérifier quand?
Lorsque vous effectuez des opérations bit à bit, de l'int en aura la même endianess que les services de renseignements que vous mettez dans. Vous n'avez pas besoin de vérifier. Vous avez seulement besoin de se soucier de cela lors de la conversion vers/à partir de séquences d'octets, dans les deux langues, autant que je sache.
En Python que vous utilisez la struct module pour cela, le plus souvent struct.pack() et struct.unpack().
Je ne pense pas que c'est vrai. Est-il une confusion ici entre byte-grand et petit stockage et de bit-wise grands et petits boutisme? Si
a
est un entier alors vous n'avez probablement pas à vous soucier de sa endianness, c'est seulement une question de comment vous l'avez créé à partir de matières de l'octet de données.Non, vous ne le seraient pas. Grand/petit-boutiste ne pas changer l'ordre des bits, mais de l'ordre de octets. Les opérations de déplacement de la poignée, en Python et en C (comme ils le sont, en fait, utiliser les processeurs opérations de décalage).
OriginalL'auteur Lennart Regebro