2012-04-10 12 views
3

Ich möchte eine java.net.InetAddress konvertieren und ich kämpfe mit den signierten/unsignierten Probleme. So ein Schmerz.konvertieren Sie eine java.net.InetAddress zu einem langen

las ich convert from short to byte and viceversa in Java und Why byte b = (byte) 0xFF is equals to integer -1?

und als Ergebnis mit aufkam:

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

Und raten Sie mal, was das Protokoll zeigt noch:

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

Weiß jemand, was ich bin nach wie vor falsch machen?

Antwort

6

& 0xff Blöcke Vorzeichenerweiterung bei der Konvertierung von byte zu int, aber Ihr Ausdruck enthält auch Konversionen von int zu long und Sie müssen auch Zeichen Erweiterung während dieser Umwandlung blockieren: Alternativ

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

, können Sie konvertieren von byte bis long in einem einzigen Schritt, durch Markieren des zweiten Operanden & 0xff Betrieb als long unter Verwendung l Suffix:

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

Willkommen bei stackoverflow! Um dies zu einer besseren Frage zu machen, können Sie mehr erklären, wie dies die Frage behandelt, anstatt nur den Code zu posten? Vielen Dank! –

1

Ich denke, dass die Antwort von user2660727 is good, weil es nur Standard-Java verwendet, kurz und effizient ist. Behebung einiger Probleme (negative Werte, Pufferlänge), meine vorgeschlagene Lösung ist:

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