En essayant de répondre à un autre message dont la solution traite des adresses IP et des masques de réseau, je me suis retrouvé avec une arithmétique simple au niveau des bits.
Existe-t-il une méthode standard, en Python, pour effectuer des opérations AND, OR, XOR, NOT au niveau des bits, en supposant que les entrées sont des entiers "32 bits" (peut-être négatifs) ou longs, et que le résultat doit être long dans la plage [ 0, 2 ** 32]?
En d’autres termes, j’ai besoin d’un équivalent en python actif pour les opérations sur les bits C entre des longs non signés.
EDIT: le problème spécifique est le suivant:
>>> m = 0xFFFFFF00 # netmask 255.255.255.0
>>> ~m
-4294967041L # wtf?! I want 255
Vous pouvez tout masquer par 0xFFFFFFFF
:
>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
Vous pouvez utiliser ctypes et son c_uint32
:
>>> import ctypes
>>> m = 0xFFFFFF00
>>> ctypes.c_uint32(~m).value
255L
Donc, ce que j’ai fait ici, j’ai converti ~m
en un entier non signé C 32 bits et récupéré sa valeur au format Python.
from numpy import uint32
C'est un module que j'ai créé il y a longtemps et qui pourrait vous aider:
Il fournit au moins une classe CIDR
avec l'arithmétique de sous-réseau. Vérifiez les cas de test à la fin du module pour des exemples.
Vous pouvez également utiliser 0xFFFFFFFF, ou l'équivalent du "complément non signé".
>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255