将Java.net.InetAddress转换为长整型。

4
我希望能将java.net.InetAddress进行转换,但我在有符号/无符号问题上遇到了困难。这真是让人头疼。
我阅读了Java中从short转换为byte以及反向转换为什么byte b = (byte) 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

有人知道我还做错了什么吗?
3个回答

6

& 0xff 在将 byte 转换为 int 时阻止了符号扩展,但是您的表达式还包含从 int 转换为 long 的转换,您也需要在这种转换过程中阻止符号扩展:

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

另外,您也可以通过使用 l 后缀将 & 0xff 操作的第二个操作数标记为 long,一步将 byte 转换为 long

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

4

我认为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();

3
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();

欢迎来到StackOverflow!为了使问题更好,您能否提供更多解释,说明如何解决问题,而不仅是发布代码?谢谢! - Corley Brigman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接