web-dev-qa-db-ja.com

Python:符号なし32ビットビット演算

ソリューションがIPアドレスとネットマスクを扱っている別の投稿に答えようとして、私は単純なビット演算で行き詰まりました。

Pythonで、入力が「32ビット」(おそらく負の)整数またはlongであり、結果が[[ 0、2 ** 32]?

言い換えると、unsignedlong間のCビット演算に対応する動作するPython)が必要です。

編集:特定の問題はこれです:

>>> m = 0xFFFFFF00   # netmask 255.255.255.0
>>> ~m
-4294967041L         # wtf?! I want 255
30

0xFFFFFFFFですべてをマスクできます:

>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
42
John Millikin

ctypes とそのc_uint32を使用できます:

>>> import ctypes
>>> m = 0xFFFFFF00
>>> ctypes.c_uint32(~m).value
255L

したがって、ここで行ったことは、~mをC32ビットの符号なし整数にキャストし、その値をPython形式で取得することでした。

51
DzinX
from numpy import uint32
10
pixelbeat

これは私がずっと前に作成したモジュールであり、あなたの助けになるかもしれません:

IPv4Utils

少なくともCIDRクラスにサブネット演算を提供します。例については、モジュールの最後にあるテストケースを確認してください。

1
tzot

「符号なし補数」と同等の0xFFFFFFFFでxorすることもできます。

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255
0
Maarten