35

试图回答另一个解决方案处理 IP 地址和网络掩码的帖子时,我被简单的按位算术困住了。

假设输入是“32位”(可能是负数)整数或长整数,并且结果必须在范围内很长 [ 0, 2**32]?

换句话说,我需要一个工作 Python 对应于无符号长整数之间的 C 位运算。

编辑:具体问题是这样的:

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

5 回答 5

57

您可以使用ctypes及其c_uint32

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

所以我在这里所做的是转换~m为 C 32 位无符号整数并以 Python 格式检索其值。

于 2008-10-17T00:27:26.710 回答
47

您可以通过以下方式屏蔽所有内容0xFFFFFFFF

>>> m = 0xFFFFFF00
>>> allf = 0xFFFFFFFF
>>> ~m & allf
255L
于 2008-10-17T00:28:43.257 回答
12
from numpy import uint32
于 2008-10-17T00:04:03.730 回答
5

您也可以与 0xFFFFFFFF 进行异或,这相当于“无符号补码”。

>>> 0xFFFFFF00 ^ 0xFFFFFFFF
255
于 2016-01-22T16:10:58.523 回答
1

这是我很久以前创建的一个模块,它可能对您有所帮助:

IPv4Utils

它至少提供了一个CIDR具有子网算法的类。检查模块末尾的测试用例以获取示例。

于 2008-10-17T07:45:07.650 回答