将java.net.InetAddress转换为long

我想转换一个java.net.InetAddress ,我与签名/未签名的问题进行斗争。 这样的痛苦。

我在Java中读取从短转换为字节和反向转换 为什么字节b =(字节)0xFF等于整数-1?

结果得出:

  final byte [] pumpeIPAddressRaw = java.net.InetAddress.getByName (pumpeIPAddressName).getAddress (); final long pumpeIPAddress = ((pumpeIPAddressRaw [0] & 0xFF) << (3*8)) + ((pumpeIPAddressRaw [1] & 0xFF) << (2*8)) + ((pumpeIPAddressRaw [2] & 0xFF) << (1*8)) + (pumpeIPAddressRaw [3] & 0xFF); android.util.Log.i ( Application.TAG, "LOG00120: Setzte Pumpen Addresse : " + pumpeIPAddress + ":" + pumpeIPPort); 

并猜猜日志仍然显示:

 04-10 13:12:07.398 I/ch.XXXX.remote.Application(24452): LOG00120: Setzte Pumpen Addresse : -1063035647:27015 

有人知道我还在做错吗?

& 0xff在从byte转换为int期间阻止符号扩展,但您的表达式还包含从intlong转换,您还需要在此转换期间阻止符号扩展:

 final long pumpeIPAddress = (((pumpeIPAddressRaw [0] & 0xFF) << (3*8)) + ((pumpeIPAddressRaw [1] & 0xFF) << (2*8)) + ((pumpeIPAddressRaw [2] & 0xFF) << (1*8)) + (pumpeIPAddressRaw [3] & 0xFF)) & 0xffffffffl; 

或者,您可以在一个步骤中将byte转换为long ,方法是使用l后缀将& 0xff操作的第二个操作数标记为long

 final long pumpeIPAddress = ((pumpeIPAddressRaw [0] & 0xFFl) << (3*8)) + ((pumpeIPAddressRaw [1] & 0xFFl) << (2*8)) + ((pumpeIPAddressRaw [2] & 0xFFl) << (1*8)) + (pumpeIPAddressRaw [3] & 0xFFl); 
 String ip = "127.0.0.1"; InetAddress inetAddress = InetAddress.getByName(ip); // ByteOrder.BIG_ENDIAN by default ByteBuffer buffer = ByteBuffer.allocate(Long.SIZE); buffer.put(inetAddress.getAddress()); buffer.position(0); Long longValue = buffer.getLong(); 

我认为user2660727的答案很好 ,因为它只使用标准的Java,简短而有效。 纠正一些问题(负值,缓冲区长度),我建议的解决方案是:

 InetAddress bar = InetAddress.getByName(ip); ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES).order(ByteOrder.BIG_ENDIAN); buffer.put(new byte[] { 0,0,0,0 }); buffer.put(bar.getAddress()); buffer.position(0); long address = buffer.getLong();