我正在尝试使用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))
是否定的。在文档中,运算符~
给出了反转,但我不明白为什么这个数字在Python中是负数而不是在Java中?
答案 0 :(得分:1)
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`