2012-04-10 12 views
3

java.net.InetAddressを変換したいと思います。私は署名付き/署名なしの問題で戦います。このような痛み。java.net.InetAddressをlongに変換する

私はconvert from short to byte and viceversa in JavaWhy byte b = (byte) 0xFF is equals to integer -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 

誰もが、私はまだだ何を知っています間違っている?

答えて

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; 

代わりに、変換することができますbyteからlongまでオペレーションの第2オペランドにl接尾辞を使用してlongをマークしてください。

final long pumpeIPAddress = 
     ((pumpeIPAddressRaw [0] & 0xFFl) << (3*8)) + 
     ((pumpeIPAddressRaw [1] & 0xFFl) << (2*8)) + 
     ((pumpeIPAddressRaw [2] & 0xFFl) << (1*8)) + 
     (pumpeIPAddressRaw [3] & 0xFFl); 
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(); 
+0

歓迎するstackoverflow!これをより良い質問にするには、単にコードを投稿するのではなく、これがどのように問題に対処するのかについてもっと説明できるでしょうか?ありがとう! –

1

それが唯一の標準的なJavaを使用していますので、私は、user2660727 is goodによって答えだと思い、短く、効率的です。いくつかの問題(負の値、バッファ長)を修正すると、私の提案する解決策は次のようになります:

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(); 
関連する問題