Python IP到整数转换无法按预期工作

时间:2018-02-13 04:13:36

标签: python ip-address

我使用here提供的答案将字符串IP转换为整数。但我没有得到预期的产量。具体来说,方法是

>>> ipstr = '1.2.3.4'
>>> parts = ipstr.split('.')
>>> (int(parts[0]) << 24) + (int(parts[1]) << 16) + \
          (int(parts[2]) << 8) + int(parts[3])

但是当我提供值172.31.22.98时,我得到了2887718498。但是,我希望看到Google的Guava库提供的值-1407248798 https://google.github.io/guava/releases/20.0/api/docs/com/google/common/net/InetAddresses.html#fromInteger-int-

另外,我已经验证this服务提供了预期的输出,但前面提到的StackOverflow答案提供的所有答案都返回2887718498

请注意,我无法使用任何第三方库。所以我几乎只限于使用手写代码(无导入)

2 个答案:

答案 0 :(得分:1)

更好的方法是使用库方法

>>> from socket import inet_aton
>>> int.from_bytes(inet_aton('172.31.22.98'), byteorder="big")
2887718498

这仍然与上面的结果相同

以下是将其视为signed int

的一种方法
>>> from ctypes import c_long
>>> c_long(2887718498)
c_long(-1407248798)

没有进口就做(但为什么?以上都是第一方CPython)

>>> x = 2887718498
>>> if x >= (1<<31): x-= (1<<32)
>>> x
-1407248798

答案 1 :(得分:0)

在尝试与OP相同的同时发现了此信息。开发以下内容供我简单理解并让他人受益。

baseIP = '192.168.1.0'
baseIPFirstOctet = (int((baseIP).split('.')[0]))
baseIPSecondOctet = (int((baseIP).split('.')[1]))
baseIPThirdOctet = (int((baseIP).split('.')[2]))
baseIPFourthOctet = (int((baseIP).split('.')[3]))