我正在尝试使用 Java 和 Python 进行广播 IP 地址编码以进行练习。这是我的 java 代码,它给了我正确的输出:
public IPv4Address getBroadcastAddress() throws IllegalArgumentException {
long bits = 0;
bits = this.address.decimalIP() ^ (~(0xffffffff ^ (1L << 32 - getMaskLength()) - 1));
IPv4Address broadcast = new IPv4Address(bits);
return broadcast;
}
这里decimalIP
是代表 IP 地址的数字,getMaskLength
- 代表其掩码的数字。在这里我得到了预期的广播地址。
通过在 python 中使用相同的逻辑,我得到了意想不到的结果:
def broadcastaddress(self):
return IPv4Address(self.address.decimalip ^ (~(0xffffffff ^ (1 << 32 - self.mask) - 1)))
这里所有组件代表与 java 中相同的条目。调试后我得到了那个号码(~(0xffffffff ^ (1 << 32 - self.mask) - 1))
是负数。在文档运算符(operator)~
给出了位反转,但我不明白为什么这个数字在 Python 中是负数,而在 Java 中不是?
最佳答案
Python 整数没有界限且没有符号,因此 ~
创建一个负数:
>>> hex(~(0xffffffff ^ (1 << 32 - 24) - 1))
'-0xffffff01'
>>> ~(0xffffffff ^ (1 << 32 - 24) - 1)
-4294967041
但是,Java 中的 ~
会给出二进制补码,而对子网掩码的操作则需要一个补码,这可以通过在网络掩码上使用XOR
来实现。由于这会撤消您已经应用的其他XOR
操作,因此您根本不需要在这里使用1的补码 :
return IPv4Address(self.address.decimalip ^ ((1 << 32 - self.mask) - 1))
我怀疑你可以使用IPv4Network.broadcast_address
这里:
network = IPv4Network('{}/{}'.format(self.address.decimalip, self.mask)
return network.broadcast_address`
关于java和python在逻辑运算符中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483011/