我正在努力获得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中却是负数。
发布于 2014-12-15 11:50:01
Python整数没有界,也没有符号,因此~创建了一个负数:
>>> hex(~(0xffffffff ^ (1 << 32 - 24) - 1))
'-0xffffff01'
>>> ~(0xffffffff ^ (1 << 32 - 24) - 1)
-4294967041但是,Java中的~将为您提供两个补码,而子网掩码上的操作需要一个补码,这可以通过在网络掩码上使用XOR来实现。因为这会撤销您已经应用过的另一个XOR操作,所以您不需要使用这里的补语at all。
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`https://stackoverflow.com/questions/27483011
复制相似问题