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

私がまだ間違っていることを誰かが知っていますか?

4

3 に答える 3

6

& 0xffからbyteへの変換中に符号拡張をブロックしますが、式にはからへintの変換も含まれているため、この変換中にも符号拡張をブロックする必要があります。intlong

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

または、操作の2番目のオペランドに接尾辞を使用するようにマークを付けることにより、1つのステップでからbyteに変換することもできます。long& 0xfflongl

final long pumpeIPAddress =
      ((pumpeIPAddressRaw [0] & 0xFFl) << (3*8)) + 
      ((pumpeIPAddressRaw [1] & 0xFFl) << (2*8)) +
      ((pumpeIPAddressRaw [2] & 0xFFl) << (1*8)) +
      (pumpeIPAddressRaw [3] &  0xFFl); 
于 2012-04-10T11:36:11.093 に答える
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();
于 2016-08-05T09:51:40.300 に答える
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();
于 2014-02-27T13:48:00.787 に答える