一个java.net.InetAddress中转换为长(convert a java.net.Ine

2019-09-16 11:25发布

我想转换一个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

有谁知道我还是做错了吗?

Answer 1:

& 0xff阻止转换过程中符号扩展byteint ,但你的表达也包含转换intlong ,你需要阻止这个转换过程中符号扩展,以及:

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

或者,可以从转换bytelong在一个单一的步骤中,通过标记的第二操作数& 0xff操作, long使用l后缀:

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


Answer 2:

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


Answer 3:

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


文章来源: convert a java.net.InetAddress to a long