我想转换一个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
,但你的表达也包含转换int
至long
,你需要阻止这个转换过程中符号扩展,以及:
final long pumpeIPAddress =
(((pumpeIPAddressRaw [0] & 0xFF) << (3*8)) +
((pumpeIPAddressRaw [1] & 0xFF) << (2*8)) +
((pumpeIPAddressRaw [2] & 0xFF) << (1*8)) +
(pumpeIPAddressRaw [3] & 0xFF)) & 0xffffffffl;
或者,可以从转换byte
到long
在一个单一的步骤中,通过标记的第二操作数& 0xff
操作, long
使用l
后缀:
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();