2017-02-14 18 views
1

いくつかのドングルサーバーと通信するために、jna経由でwindows-dllを使用しています。 dllには、接続、切断、ドングルの接続状態の3つの機能があります。接続と切断の作業。しかし、私がステータスを照会するとき、デバイスは私がDWORDに保存するIPアドレスを返すべきです。ネットワークバイトオーダーからホストバイトオーダーへの変換Java

int AwUsbGetConnectionStatus(String Hub, DWORDByReference IpAddress, IntByReference Status, DWORD Timeout, HANDLE Event); DWORD value = ipAddress.getValue();

DLLの状態の仕様:コードはDWORDByReference IpAddressがアウトパラメータである、のようなものである「IPアドレスは、ホストバイトオーダーにあり、使用してTCP/IPのネットワークバイトオーダーに変換することができますWinSock htonl関数。 "

static int htonl(int val) { return ByteBuffer.allocate(4).putInt(val) .order(ByteOrder.nativeOrder()).getInt(0); }

しかし、問題は、私は奇妙な値を得ることを、次のとおりです。

は別のスレッドでは、私はhtonlと同じJavaであることを読みました。しかし、どういうわけか彼らは想定されているipアドレスの値に対応しています。
たとえば、元のIpが192.168.102.118
の場合は、1986439360
が返され、上記の方法で変換すると、-1062705546になります。
は、しかし、私は

正しく変換するとき、それは192168102118でなければならないと思い、私が試してみました。また、別のIPアドレスだった: 192.168.102.112 いる私は1885776064 を取得し、私はそれがとても-106270552

だと変換するときIPアドレスの差は元のアドレスと変換された値ではまだ6です。私はこれをさまざまなIpsで試しました。そして、Ipsの違いは常に想定される値と一致します。 だから、誰かが知っている、私は値を変換する方法に何か間違っている場合、またはDWORDパラメータの値を取得するときにも問題がある可能性がありますか?

+0

「192168102118」は32ビット値では大きすぎます。各数値の文字列値を連結しません。迅速な健全性チェック。 10桁以上ある場合は、 'int'ではありません。 –

+0

注: 'Integer.reverseBytes(x)'はずっと速く/簡単です。 –

答えて

1

です。

そして、ドット付きクワッド出力が必要なのはあなたのコメント(「正しく変換されたら192168102118だと思います」というコメントから)です。そのため、バイト配列を使用すると、より自然であってもよい。

static byte[] htoip(int ipv4) { 
    return ByteBuffer.wrap(new byte[4]) 
        .order(ByteOrder.nativeOrder()) 
        .putInt(ipv4) 
        .array(); 
} 

この結果は等、InetAddress.getByAddress()に渡すのに適しています

これは4バイトを逆にする最も簡単な方法ではありませんが、ByteOrder.nativeOrder()を使用すると、移植性があり、将来的には問題なく使用できます。

1

10進数値(-1062705546)を4バイトに分割する必要があります。その場合、あなたは16進数で、なるだろう:192.168.102.118に対応

C0 A8 66 76

1

このメソッドから返される値は正しいです。 Javaでは、すべての整数が署名されています。符号なしの型はありません。

あなたのIP 192.168.102.118のためにHEX番号は、符号付き整数に変換C0 A8 66 76は、あなたがそれにリトルエンディアンアドレスを入れて前に順番を設定する必要があります-1062705546

関連する問題